我一直在使用azure服务总线在Web角色和工作者角色之间来回发送消息,我真的认为这是一个非常好的解决方案,但最近我发现服务总线非常不稳定,有时它工作,有时候消息毫无理由地进入死信。我不知道它在我的代码中是否存在问题,但它在我看来它是不稳定的,因为有时它有效,有时它不会。所以我想知道是否有任何替代服务总线的解决方案,或者我很高兴知道在服务总线实现中所做的任何错误导致我的上述问题。以下是我的代码
public override void Run()
{
while (!IsStopped)
{
try
{
if (BroadcastReceived)
{
BroadcastReceived = false;
// Receive the message from Web Role to upload the broadcast to queue
BroadcastClient.BeginReceive(OnWebRoleMessageReceived, null);
}
if (SignalRMessageReceived)
{
SignalRMessageReceived = false;
// Receive the message from SignalR BroadcastHub
SignalRClient.BeginReceive(OnSignalRMessageReceived, null);
}
if (SignalRFirstTimeMessageReceived)
{
SignalRFirstTimeMessageReceived = false;
// Receive the message from SignalR BroadcastHub
SignalRFirstTimeClient.BeginReceive(OnSignalRFirstTimeMessageReceived, null);
}
}
}
public void OnWebRoleMessageReceived(IAsyncResult iar)
{
BrokeredMessage receivedBroadcastMessage = null;
receivedBroadcastMessage = BroadcastClient.EndReceive(iar);
if (receivedBroadcastMessage != null)
{
// Process the message
receivedBroadcastMessage.Complete();
}
BroadcastReceived = true;
}
在上面的代码中,我展示了只有一个服务总线客户端的方法。在我的工作角色中,使用3个服务总线客户端,即异步发送和接收来自不同队列的消息。一些消息如何工作真的很奇怪,有些消息没有任何理由去死信,有时它的备用,所以我认为我的代码中一定有问题,但我找不到。如果有人不知道问题是什么,请告诉我
答案 0 :(得分:0)
您考虑过NServiceBus吗?我不确定是否有很多关于集成SignalR和NServiceBus的例子,但谷歌搜索应该让你开始
http://ben.onfabrik.com/posts/push-notifications-with-nservicebus-and-signalr
答案 1 :(得分:0)
在没有显式调用message.DeadLetter()的情况下,消息进入DeadLetter队列的原因有几个。检查以下内容: 1)队列和消息上的TimeToLive,如果此时间到期,则消息将被破坏并且不会被传递。默认情况下,这是无限的。 2)传递计数确定在破坏之前收到消息的次数。上面我没有看到任何异常处理,所以说你在消息处理过程中遇到错误并且没有在消息上调用完成,传递计数会增加。在队列中,您可以使用option来设置邮件在死信之前应该传递的次数。