为什么Azure服务总线在被两个工作者角色访问时不能工作
本文关键字:角色 工作者 两个 访问 工作 不能 总线 服务 Azure 为什么 | 更新日期: 2023-09-27 18:06:49
我使用服务总线在web角色和worker角色之间进行通信,但它一直给我一些不稳定的结果。我已经将我的云项目部署到azure。所以令人惊讶的是,当我只运行部署的项目时,服务总线工作正常,但是当我也在使用服务总线的本地模拟器上运行相同的项目时,服务总线变得错误,因为在所有消息中,要么去死信,要么不被工作者角色接收。这是服务总线的正常行为吗?如果不是什么问题,我怎么能解决它?
这对我来说很恼火,因为现在当我在本地模拟器上运行我的项目时,服务总线从来没有正常工作。
这是我发送和接收消息的方式,但我猜问题可能不在其中,因为当服务总线仅由部署的项目使用时,它可以正常工作。
工作者角色:
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;
}
Web角色:var queueClient = CloudStorageHelper.GetServiceBusQueueClient(Queuenames.ApiToWorkerRole);
BrokeredMessage message = new BrokeredMessage(record);
queueClient.Send(message);
如何创建服务总线队列:
public static QueueClient GetServiceBusQueueClient(string queuename)
{
string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");
var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
if (!namespaceManager.QueueExists(queuename))
{
namespaceManager.CreateQueue(queuename);
}
QueueClient Client = QueueClient.CreateFromConnectionString(connectionString, queuename);
return Client;
}
您能详细说明一下吗?
1)您是否使用相同的服务总线连接字符串用于调试和部署的服务?请注意,服务总线队列/主题不会在模拟器中运行,即使在那里调试云服务时也是如此,因此您总是会碰到Azure中的实时服务。
2)检查Queue/Topic/Messages的MaxDeliveryCount和timeolive属性。当消息上的DeliveryCount超过MaxDeliveryCount时,消息是死信的,该值在每次接收到并且不完成消息时递增(在调试时可能需要设置更高的值)
出现问题是因为在工作者角色中,我们不断检查服务总线队列以查看消息是否已到达。当我们同时启动本地和云工作者角色时,两个工作者角色都会尝试从相同的服务总线队列接收新消息。因此,有时云接受它,有时本地的。
为云和本地项目使用不同的服务总线队列名称解决了这个问题。