itsource

파란색 서비스 버스 대기열을 한 번에 지웁니다.

mycopycode 2023. 4. 22. 09:27
반응형

파란색 서비스 버스 대기열을 한 번에 지웁니다.

프로젝트에서는 서비스 버스 큐를 사용하고 있습니다.관리자가 큐를 클리어하도록 선택한 경우 큐에서 모든 메시지를 삭제하는 기능이 필요합니다.했지만, 이 기능은 .QueueClient를 누릅니다

큐를 클리어하기 위해 모든 메시지를 하나씩 팝한 후 완료로 표시해야 합니까?아니면 더 좋은 방법이 있나요?

QueueClient queueClient = _messagingFactory.CreateQueueClient(
                              queueName, ReceiveMode.PeekLock);

BrokeredMessage brokeredMessage = queueClient.Receive();

while (brokeredMessage != null )
{
    brokeredMessage.Complete();
    brokeredMessage = queueClient.Receive();
}

이것은, Azure 포털로부터 간단하게 실시할 수 있습니다.

지난 14일 동안 저장된 큐메시지가 걱정되지 않고 큐를 즉시 클리어할 경우 메시지 라이브 시간을 5초 또는 10초로 변경하고 5~10초간 기다립니다.

중요 절차: 몇 초 후 큐에서 수신하여 강제로 업데이트를 시도합니다.

모든 큐 메시지가 클리어 됩니다.원래 값을 다시 설정할 수 있습니다. 기본값은 14일입니다.

여기에 이미지 설명 입력

「 」의 Receive() while 하면 while loop이 비어 됩니다.Receive()메서드는 큐에 다른 메시지가 나타나기를 기다립니다.

을하십시오.Peek()★★★★★★ 。

예를 들어 다음과 같습니다.

while (queueClient.Peek() != null)
{
    var brokeredMessage = queueClient.Receive();
    brokeredMessage.Complete();
}

하면 다시 할수 있어요.ReceiveMode.ReceiveAndDelete호쵸가 말한 바와 같이

사용방법:

서비스 버스 큐 또는 토픽/설명을 비우는 메서드를 작성할 수 있습니다.

MessageReceiver messageReceiver = ...
while (messageReceiver.Peek() != null)
{
    // Batch the receive operation
    var brokeredMessages = messageReceiver.ReceiveBatch(300);

    // Complete the messages
    var completeTasks = brokeredMessages.Select(m => Task.Run(() => m.Complete())).ToArray();

    // Wait for the tasks to complete. 
    Task.WaitAll(completeTasks);
}

질문을 읽었을 때 첫 번째로 생각한 것은 큐를 삭제하고 다시 작성하는 것이 어떻겠느냐는 것이었습니다.그게 접근법일 수도 있어그러나 원하지 않는 경우 메시지가 남아 있지 않을 때까지 각 메시지를 수신하고 삭제할 수 있습니다.

최신 Azure 서비스 버스를 사용할 수 있습니다.NET 라이브러리 Azure.메시지 접근 방식 모두 ServiceBus입니다.

  1. 하여 큐를 삭제하고 .AdministrationClient
using Azure.Messaging.ServiceBus.Administration;

ServiceBusAdministrationClient adminClient = new ServiceBusAdministrationClient("<connectionstring>");
await adminClient.DeleteQueueAsync("myqueue");          
await adminClient.CreateQueueAsync("myqueue");          

★★★★★★ServiceBusAdministrationClient기존 서비스 버스 이름 공간에서의 CRUD 조작용입니다.네임스페이스를 작성하는 기능도 필요한 경우는, Microsoft 를 사용해 주세요.Azure, 관리직입니다.대신 ServiceBus 라이브러리를 사용합니다.

  1. 메시지가 없을 때까지 수신 및 삭제
using Azure.Messaging.ServiceBus;

await using var client = new ServiceBusClient("<connectionstring>");
                
ServiceBusReceiver receiver = client.CreateReceiver("myqueue", 
    new ServiceBusReceiverOptions { ReceiveMode = ServiceBusReceiveMode.ReceiveAndDelete });

while ((await receiver.PeekMessageAsync()) != null)
{
    // receive in batches of 100 messages.
    await receiver.ReceiveMessagesAsync(100);
}

ReceiveMode = ServiceBusReceiveMode.ReceiveAndDelete자동 조절이 가능합니다.는, 「」입니다.PeekLock큐에서 실제로 메시지가 삭제되지는 않습니다.수신 클라이언트가 수신한 메시지를 명시적으로 해결하고 싶다고 서비스 버스에 알립니다.잠금 부분은 잠금 기간 동안 경쟁 수신자가 메시지에 액세스할 수 없음을 의미합니다.

Peek를 사용하지 않고 ReceiveAndDelete, PrefetchCount, ReceiveBatchAsync 및 단순한 진실 루프를 조합하여 좋은 결과를 얻고 있습니다.다음 Messaging Factory의 예:

var receiverFactory = MessagingFactory.CreateFromConnectionString("ConnString");
var receiver = receiverFactory.CreateMessageReceiver("QName", ReceiveMode.ReceiveAndDelete);
receiver.PrefetchCount = 300;

bool loop = true;
while (loop)
{
    var messages = await receiver.ReceiveBatchAsync(300, TimeSpan.FromSeconds(1));
    loop = messages.Any();
}

WindowsAzure만 필요합니다.ServiceBus Nuget 패키지

Azure-ServiceBus-Queues에는 n-메시지의 배지를 동시에 수신할 수 있는 - 방식이 있습니다.와의 조합ReceiveMode.ReceiveAndDelete큐를 보다 효율적으로 클리어할 수 있습니다.

경고 n개의 메시지가 반환될 수 있지만 보장되지는 않습니다.또한 메시지 배치 크기에는 256K의 제한이 있습니다.

Azure ServiceBus 큐를 청소하는 가장 빠른 방법은 매우 짧게 설정하는 것입니다.DefaultMessageTimeToLive, 잠시 기다려 주세요.큐에서 수신을 강제로 갱신하고 초기화를 복원합니다.DefaultMessageTimeToLive.

포털 또는 코드에서 실행할 수 있습니다.

var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
var queueDescription = _namespaceManager.GetQueue(queueName);
var queueClient = QueueClient.CreateFromConnectionString(connectionString, queueName, ReceiveMode.ReceiveAndDelete);

var dl = queueDescription.EnableDeadLetteringOnMessageExpiration;
var ttl = queueDescription.DefaultMessageTimeToLive;

queueDescription.EnableDeadLetteringOnMessageExpiration = false;
queueDescription.DefaultMessageTimeToLive = TimeSpan.FromSeconds(1);

Thread.Sleep(5000);
var dumy = queueClient.ReceiveBatch(200, TimeSpan.FromSeconds(1)).ToArray();

queueDescription.EnableDeadLetteringOnMessageExpiration = dl;
queueDescription.DefaultMessageTimeToLive = ttl;

심플한 것이 있습니다.Clear()WindowsAzure 를 사용하고 있는 경우는, 큐 전체를 클리어 합니다.nuget의 스토리지 라이브러리.사용하다Microsoft.Windows.Azure.Queue큐를 관리할 수 있습니다.그렇지 않으면 문서에 따라 API를 통해 액세스할 수 있습니다.이 메서드가 Azure 라이브러리에 얼마나 오래 존재했는지 알 수 없으며, 처음 질문을 받았을 때는 존재하지 않았을 수도 있지만, REST API는 이 Azure 피드백 게시물에 따르면 적어도 2014년부터 거슬러 올라갑니다.

풀.Azure 라이브러리에서 큐를 클리어하기 위한 NET 코드는 다음과 같습니다.

string connectionString = "YourAzureConnectionStringHere";
string queueName = "YourWebJobQueueName";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

// Create the queue client, then get a reference to queue
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
queue = queueClient.GetQueueReference(GetQueueName(queueName));

// Clear the entire queue
queue.Clear();
  1. 큐 서비스 REST API를 사용합니다(테스트되지 않음).

[메시지 클리어(Clear Messages)]조작에 의해 지정된 큐에서 모든 메시지가 삭제됩니다.

https://myaccount.queue.core.windows.net/myqueue/messages 삭제

계정 소유자만 이 작업을 호출할 수 있습니다.

추신. URL이 잘못된 것 같습니다.대신 https://myaccount.servicebus.windows.net/myqueue/messages 를 사용해 보세요.

출처 : https://learn.microsoft.com/en-us/rest/api/storageservices/clear-messages

아니면...

  1. 루프(테스트)에서 메시지를 하나씩 삭제하는 논리 앱을 만듭니다.

여기에 이미지 설명 입력

언급URL : https://stackoverflow.com/questions/9920323/clearing-azure-service-bus-queue-in-one-go

반응형