为什么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;
}

为什么Azure服务总线在被两个工作者角色访问时不能工作

您能详细说明一下吗?

1)您是否使用相同的服务总线连接字符串用于调试和部署的服务?请注意,服务总线队列/主题不会在模拟器中运行,即使在那里调试云服务时也是如此,因此您总是会碰到Azure中的实时服务。

2)检查Queue/Topic/Messages的MaxDeliveryCount和timeolive属性。当消息上的DeliveryCount超过MaxDeliveryCount时,消息是死信的,该值在每次接收到并且不完成消息时递增(在调试时可能需要设置更高的值)

出现问题是因为在工作者角色中,我们不断检查服务总线队列以查看消息是否已到达。当我们同时启动本地和云工作者角色时,两个工作者角色都会尝试从相同的服务总线队列接收新消息。因此,有时云接受它,有时本地的。

为云和本地项目使用不同的服务总线队列名称解决了这个问题。