完全披露:我是Service Fabric开发的新手。这是我的情况。我们有Service Fabric Cluster。我们在那里部署了有状态服务。服务已指定它侦听的服务总线队列。因此,群集中所有节点上的所有服务实例都会侦听相同的Service Bus队列。每个服务实例都使用Service Bus队列调用OnMessage回调来处理这样的消息:
QueueClient Queue = QueueClient.CreateFromConnectionString(
GetServicebusConnectionString(),
ConfigData.SERVICE_QUEUE_NAME);
if (Queue != null)
{
var options = new OnMessageOptions();
options.AutoComplete = false;
Queue.OnMessage((receivedMessage) =>
ProcessMessage(receivedMessage), options);
}
现在,根据日志中的消息,看起来所有服务实例都会收到消息,该消息已同时放入队列中。哪个不构成好事。 问题是:
当队列中的每条消息只被一个服务实例接收时,是否可以使用Service Bus队列?
答案 0 :(得分:1)
队列客户端的默认receive mode是 PeekLock ,并且您将自动完成属性设置为false,这在客户端收到消息后不会自动删除消息信息。锁定到期后,该消息将再次可用,其他服务实例可以再次接收和处理它。
是否可以以某种方式使用Service Bus队列,此时队列中的每条消息只能由一个服务实例获取?
您可以将AutoComplete属性设置为true,或在客户端收到并处理该消息后调用Complete method。
Queue.OnMessage((receivedMessage) =>
{ ProcessMessage(receivedMessage); receivedMessage.Complete(); }, options);