我在需要管理有序消息的系统上投入了服务总线。在我的公司中,我们所有内容都在Azure云上,并且我正在使用Azure服务总线进行消息传递。 我阅读了有关该会话的信息,似乎可以使用Azure服务总线解决开箱即用的问题,但它仅适用于单个实例。一旦将we job扩展到多个实例,一个以上的实例就会使用同一会话中的相同消息。 在我的POC中,我使用带有订阅的主题。
有人能够使其扩展到接收器的多个实例吗? 我的第二个选择是自己实施Resequencer企业模式,您有什么建议吗?
这是我用来接收消息的代码:
static async Task InitializeReceiver(string connectionString, string queueName, CancellationToken ct)
{
var receiverFactory = MessagingFactory.CreateFromConnectionString(connectionString);
ct.Register(() => receiverFactory.Close());
var client = receiverFactory.CreateSubscriptionClient(queueName, "parallel", ReceiveMode.ReceiveAndDelete);
client.RegisterSessionHandler(
typeof(SessionHandler),
new SessionHandlerOptions
{
AutoRenewTimeout = TimeSpan.FromMinutes(5),
MessageWaitTimeout = TimeSpan.FromSeconds(120),
MaxConcurrentSessions = 100,
AutoComplete = false
});
}
这是我用于处理的代码:
public async Task OnMessageAsync(MessageSession session, BrokeredMessage message)
{
await ProcessMessage(session, message, currentInstanceId, recipeStep);
// If I process the last message of the session
if (message.Sequence == numberOfMsgPerSession)
{
// end of the session!
await session.CloseAsync();
logger.LogInformation($"Session with id {message.SessionId} is completed.");
}
}
谢谢。 问候。
答案 0 :(得分:1)
我使用计时器来触发Web作业中的方法。在扩展方面,计时器的数量与实例的数量成比例地增加。在那里,我用Azure Service Bus主题订阅替换了计时器。由于消息只能接收一次,因此即使有多个正在运行的实例,这些方法也只能触发一次。
我有一个活动的接收者正在监听消息,请检查here以创建活动的监听器。
正如您所说的,消息是在多个实例中接收的,您可能偷看了这些消息,而不是接收到它们。窥视消息不会将其从订阅中删除。仅接收它会从“订阅”中删除它,从而导致该消息对其他接收者不可用。
答案 1 :(得分:0)
我解决了。 如果您看到我在问题中发布的代码,则在我根据其序列号处理最后一条消息时,对于每个会话,我都将其关闭。 一次,我删除了这段代码,一切都开始正常工作,我每会话发送200条消息,其中包含10个会话。对于每个会话,邮件都是按顺序处理的,并且不超过一个实例像我期望的那样进行会话。
谢谢大家。 OaicStef