即使消息被放弃,Azure 会话消费者似乎也被锁定到同一个工作人员服务
Azure Session Consumer seems to be locked to same Worker Service even when Message gets Abandoned
我有一个 Azure 消息总线主题。
对于这个主题,我有一个“启用会话”的 Azure 消息总线使用者。
我有大约 3 个使用相同消费者的工作人员服务。因此,工作由这 3 个 Worker 共享。
发送给消费者的消息需要排序,这就是我在消费者上使用“会话功能”的原因。
我相信在第一条消息上,消息的会话会绑定到工作服务。
由于某些原因,我不仅要放弃消息,还要放弃会话,以便它可以被 3 个工作人员服务中的另一个接收。
我的问题:
- 这可能吗?
- 如果是,我如何在代码中执行此操作?
- 是否有类似“是否接受会话”的处理程序在收到消息时启动?
查看下面的代码:
private void SetupServiceBusSessionProcessors2()
{
var busProcessorOptions = new ServiceBusSessionProcessorOptions();
var busProcessor = _busClient.CreateSessionProcessor("fooTopic", "fooSubscription", busProcessorOptions);
busProcessor.ProcessMessageAsync += args => ProcessSessionMessageHandler2(args);
}
private async Task ProcessSessionMessageHandler2(ProcessSessionMessageEventArgs args)
{
if (false) // Condition here which Abandons Message AND Session
{
// the following line of code seems only to abandon the Message
// but it seems like the session is locked to this service
// i want that other services which are listening via the same consumer can try to handle the session
await args.AbandonMessageAsync(args.Message);
}
}
这在版本 7.3.0-beta.1 中可以使用事件参数上的 ReleaseSession 方法。请注意,这是测试版,因此 API 在发布稳定版本之前可能会有所更改。
- Is this possible?
不,不可能放弃会话。
当多个并发接收者开始从队列接收消息时,属于特定会话的消息将分派给当前持有该会话锁的特定接收者。
通过该操作,驻留在 Queue 或 Subscription 中的巨大消息流被多路分解到不同的接收者,这些接收者可以在不同的机器上,因为锁管理发生在服务端,在服务总线内。
放弃 一条消息会导致在下一个接收操作中再次提供同一消息。
发送消息的客户端应用程序必须在发送的每条消息中将唯一标识符设置为“SessionId”。
现在,接收应用程序应使用相应的“SessionId”创建会话接收器并接收与特定客户端相关的消息集。
通过这种方式,特定客户端对应的所有消息都可以被特定的单个接收者接收。
您可以参考此 doc 了解更多信息。
我有一个 Azure 消息总线主题。 对于这个主题,我有一个“启用会话”的 Azure 消息总线使用者。 我有大约 3 个使用相同消费者的工作人员服务。因此,工作由这 3 个 Worker 共享。 发送给消费者的消息需要排序,这就是我在消费者上使用“会话功能”的原因。
我相信在第一条消息上,消息的会话会绑定到工作服务。 由于某些原因,我不仅要放弃消息,还要放弃会话,以便它可以被 3 个工作人员服务中的另一个接收。
我的问题:
- 这可能吗?
- 如果是,我如何在代码中执行此操作?
- 是否有类似“是否接受会话”的处理程序在收到消息时启动?
查看下面的代码:
private void SetupServiceBusSessionProcessors2()
{
var busProcessorOptions = new ServiceBusSessionProcessorOptions();
var busProcessor = _busClient.CreateSessionProcessor("fooTopic", "fooSubscription", busProcessorOptions);
busProcessor.ProcessMessageAsync += args => ProcessSessionMessageHandler2(args);
}
private async Task ProcessSessionMessageHandler2(ProcessSessionMessageEventArgs args)
{
if (false) // Condition here which Abandons Message AND Session
{
// the following line of code seems only to abandon the Message
// but it seems like the session is locked to this service
// i want that other services which are listening via the same consumer can try to handle the session
await args.AbandonMessageAsync(args.Message);
}
}
这在版本 7.3.0-beta.1 中可以使用事件参数上的 ReleaseSession 方法。请注意,这是测试版,因此 API 在发布稳定版本之前可能会有所更改。
- Is this possible?
不,不可能放弃会话。
当多个并发接收者开始从队列接收消息时,属于特定会话的消息将分派给当前持有该会话锁的特定接收者。
通过该操作,驻留在 Queue 或 Subscription 中的巨大消息流被多路分解到不同的接收者,这些接收者可以在不同的机器上,因为锁管理发生在服务端,在服务总线内。
放弃 一条消息会导致在下一个接收操作中再次提供同一消息。
发送消息的客户端应用程序必须在发送的每条消息中将唯一标识符设置为“SessionId”。 现在,接收应用程序应使用相应的“SessionId”创建会话接收器并接收与特定客户端相关的消息集。
通过这种方式,特定客户端对应的所有消息都可以被特定的单个接收者接收。
您可以参考此 doc 了解更多信息。