标签: azureservicebus

调试已部署的云服务应用程序

已部署的云服务应用如何调试?

我正在尝试使用主题和订阅在我的应用程序中呈现 RDLC 报告。每当我在本地运行云应用程序时,我都不会收到任何错误。但是,一旦我将其部署在云上,我就会收到一个错误,该错误未在一定程度上进行描述,因此无法纠正。

我发现错误是在准备好呈现报告时出现的,而不是在其他地方出现。我正在寻找一种可能的机制(像我们在本地那样插入断点等),使用它可以调试已部署的云应用程序。

由于我使用的是 VS2012 Express 和 professional,intellitrace 在这里不起作用。

rdlc azure intellitrace visual-studio-debugging azureservicebus

5
推荐指数
1
解决办法
511
查看次数

Azure SB 队列将消息发送到禁用的死信队列

为什么我的 Azure 服务总线队列在未启用时将消息发送到死信子队列?

从一开始我就确保过期的消息不会被移动到死信队列(或者我是这么认为的)。

在 Visual Studio Server Explorer 中,我在队列下看到以下内容:

  • EnableDeadLetteringOnMessageExpiration:False

但我也看到了这一点:

  • 死信消息计数:16

我无法像平常一样将它们拉出来,所以我创建了一个临时服务来处理(摆脱)这些,这就是我能够从以下内容中提取的内容brokeredMessage.Properties

  • 死信原因:MaxDeliveryCountExceeded
  • DeadLetterErrorDescription:消息在 10 次传递尝试后无法使用。

我希望消息在未完成时保留在正常队列中。到目前为止,我已将 MaxDeliveryCount 更改为 1000,但这不是真正的解决方案。

我在忽略什么?

更新 在阅读我自己的文本后,我意识到 EnableDeadLetteringOnMessageExpiration 与传递计数无关。我是否可以选择让我的消息永远保留在正常队列中?或者我是否必须将 MaxDeliveryCount 设置为“足够高”?

dead-letter azureservicebus azure-servicebus-queues

5
推荐指数
1
解决办法
1505
查看次数

ServiceBus 消息版本控制的最佳实践

我正在建立一个系统,我们将在 ServiceBus 主题上的多个内部服务之间传输消息。消息将保存序列化的对象。模型对象被定义为相当复杂的类树。这意味着在代码中维护模型结构的双重版本是不切实际的。

我们预计模型结构会发生变化,因此我将模型版本作为代理消息的属性公开。

当我们需要升级模型版本时,处理过渡的最佳方法是什么?

我不认为我们真的需要支持两个并行模型版本。但我担心我们在过渡期间不会丢失信息。我认为首先升级发送服务并让所有订阅者继续处理消息是一个很好的策略。当之前版本的所有消息都处理完毕后,就到了订阅服务升级的时候了。

跳过侦听服务当前未处理的新版本消息的最佳机制是什么?

  1. 我知道我可以回到老方法,通过使用 json 或 xml 模式来定义并行模型版本,从而使监听服务能够处理并行版本。但这会很麻烦,所以我真的想避免这种情况。

  2. 我注意到 BrokeredMessage 有一个 Defer 方法。那会有用吗?它看起来很有希望,直到我意识到消息将从实时队列“移动”到一个单独的状态,需要通过按键引用它们来拉取它们。不实用。

  3. 是否可以通过修改发送时间来推迟消息?几分钟就可以了。如果到那时相同的服务仍在运行,则可以再次推迟。(如果有工作代码示例,我们将不胜感激!)

  4. 我需要根据型号版本创建单独的订阅吗?到目前为止,我们允许不同的消息类型在同一主题上传播,因此需要进行一些重新设计。

c# version servicebus azureservicebus

5
推荐指数
1
解决办法
4234
查看次数

Azure 服务总线 - 避免并行处理来自同一设备的消息

许多设备正在发送消息,这些消息最终进入单个 Azure 服务总线队列(或主题)。我们希望并行处理多个消息,但我们希望避免在任何给定时间并发处理同一设备的两个消息。

下图说明了目标。有 3 个处理线程(实际上可能有几十个,分布在多个服务器之间)。每个方框表示单个消息的处理时间,颜色表示它属于哪个设备。

消息的并发处理

您可以看到,在任何时间点都没有来自同一设备的两个或多个重叠消息。

由于涉及多个处理服务器,我可以想象防止并发处理的唯一方法是以设备 ID 作为分区键对消息进行分区,然后每个分区只有一个消费者:

在此输入图像描述

因此,来自“黄色设备”的所有消息都会发送至分区 1,依此类推。

我仍然想在单个进程中运行多个处理线程。现在,我们做一些简单的事情,比如

var client = QueueClient.CreateFromConnectionString(connectionString, queueName);
var options = new OnMessageOptions { MaxConcurrentCalls = x };
client.OnMessage(m =>
    {
        // Process...
        m.Complete();
    });
Run Code Online (Sandbox Code Playgroud)

如何将并发限制合并到此类代码中?

我可以想象一些基于参与者或其他并发机制的客户端解决方案。但有没有办法在 Broker 层面解决这个问题呢?

concurrency azure azureservicebus

5
推荐指数
1
解决办法
3948
查看次数

Azure 服务总线会话 - MaxConcurrentSessions 与 MaxConcurrentCalls

本页介绍如何使用 Azure 服务总线中的会话将来自同一源的消息分组到相同的接收器中。

在无会话队列处理器中,我可以控制可以并行获取的消息数量:

new OnMessageOptions { MaxConcurrentCalls = 10 };
Run Code Online (Sandbox Code Playgroud)

如果我传递这些选项,则同时处理的消息不会超过 10 条。

现在,对于会话式处理器,选项被替换为

new SessionHandlerOptions { MaxConcurrentSessions = 10 };
Run Code Online (Sandbox Code Playgroud)

其含义不同,即同时进行的会话不超过 10 个。

我的会话寿命相对较长,而且大部分都是空闲的,因此我必须将此参数设置为较高的值。但是,我仍然想限制并行消息的数量。

这可以开箱即用吗?

MaxConcurrentSessions 如果我设置为,并行化的实际限制是什么int.MaxValue

azureservicebus

5
推荐指数
2
解决办法
5640
查看次数

Webhook 可以直接传递到 Azure 事件中心吗?

我已经阅读了 Azure 上有关使用共享访问签名的大量文档,并且我不认为可以将 Webhook 直接传递到 Evenhtubs。我认为像 Azure Function 或 Logic App 这样的中间服务目前需要充当中间人。

生成 Webhook 的服务必须选择实现 Azure 共享访问签名用于 Eventhub 的签名方案才能接收此类 Webhook 的说法是否正确?

此外,是否有任何 Azure PAAS 服务(例如文档 DB 或 Azure SQL)具有 API 身份验证方案,可以通过相当简单的 Webhook 直接写入?

azure webhooks azureservicebus azure-eventhub

5
推荐指数
1
解决办法
4053
查看次数

MassTransit Azure 发布许多消息

我只是想知道是否有人曾经发送/发布过 100 万以上使用 MassTransit 向 Azure

目前,一次发送/发布一条消息的过程非常缓慢(大约 25K 条消息需要 10 分钟)。无论如何,我看不到批量发送消息,但我可能会丢失一些东西。

我确实看到Azure支持SendBatch,它的总体消息大小限制为256K,但是我们有很多小消息需要出去,我想知道是否有人扩展了MassTransit来支持此功能,或者有其他一些关于如何提高绩效的建议。

所有的建议都得到了极大的重视。

c# masstransit azureservicebus

5
推荐指数
0
解决办法
477
查看次数

为什么 Azure 流量管理器不能与服务总线一起使用?

我正在尝试使用流量管理器来处理不同区域中的 2 个服务总线,以提供弹性,而不必向两个区域发送重复的消息,如https://learn.microsoft.com/en-us/azure/service-bus中所述-消息/服务总线中断灾难

我希望使用服务总线 REST API 使流量管理器查询 URL namespace.servicebus.windows.net/ 进行运行状况检查,因为它通常会返回 200,并且如果某个区域面临中断,可能会无法连接。

由于选择“Azure 终结点”时,流量管理器中的下拉菜单拒绝让我选择任意 URL,因此我尝试使用上述 URL 来选择“外部终结点”,但不会创建终结点。它失败并显示“无法将配置更改保存到流量管理器配置文件错误:域名 xxx 无效”。

如果 url xxx.servicebus.windows.net/ 可以从外部解析,为什么流量管理器不允许这样做?

servicebus azureservicebus azure-traffic-manager

5
推荐指数
1
解决办法
1293
查看次数

Azure Function - 限制服务总线触发

我目前正在评估使用服务总线和 azure 函数来触发一些需要通过下游 api 调用完成的工作。这一切都是相当标准的,只是我没有很好地处理当下游系统过载和/或将标头返回到节流阀时会发生什么(即每分钟最大调用数/等)。我们似乎没有对队列触发器的强制限制进行任何动态控制。

我知道我们可以手动设置最大并发数,但这不一定能解决问题,因为我们无法控制下游系统,并且需要考虑它随时可能离线或缓慢。

此外,我们可以创建消息,以便它们被安排以一定的速率流入,但下游系统仍然可能饱和或返回速率限制。

选项1:

假设消费计划,从解决方案的角度来看,这是我能想到的一种方法:

  • 队列 1 - 全速或最大速度。如果我们开始受到速率限制,请设置一个缓存值。如果设置了缓存值,则不处理该消息,克隆它并放入queue2中
  • Queue2 - 每个最大并发/预取计数较低。与上面相同的过程,但推入队列3。
  • Queue3 - 每个最大并发/预取计数的最低值。我们只是慢慢地处理它们。

基本上,当下游系统饱和时,队列 1 成为队列 2 和队列 3 的控制器。

选项2:

我们可以克隆消息并在将来重新排队,并继续这样做,直到它们都是进程。保留一个队列并重新排队,直到我们处理完它。

选项 3:

假设我们有自己的应用程序计划,该计划是专用的而不是消耗的,我想我们可以Thread.Sleep在功能接近速率限制或下降时继续重试。这可能是最大并发数、实例和速率限制的计算。我不会在消费计划中考虑这一点,因为睡眠可能会大幅增加成本。

我想知道我是否缺少一些简单的方法来处理下游饱和或限制队列触发器(可能是服务总线或存储队列)

编辑:我想补充一点,我将 100 万条消息注入到发送时安排的服务总线队列中。我观察到 Azure Function(消耗计划)规模达到了大约 1500/秒,这提供了一个很好的指标。我不确定那些专注的人会表现如何。

看起来主机文件可以即时修改并且设置立即生效。尽管这适用于所有功能,但它可能适用于我的特定情况(更新设置并每隔一分钟左右再次检查一次,具体取决于速率限制)。

当功能团队实施时,这看起来可能是朝着正确方向迈出的一步,但即便如此,我们仍然需要一种方法来管理下游错误。

azure azureservicebus azure-servicebus-queues azure-functions

5
推荐指数
1
解决办法
3851
查看次数

如何为 Azure 服务编写 MassTransit Json 解串器

这是我将对象发布到事件网格的方式。我希望能够使用azure服务总线来收听它。

        public void Publicar<T>(T model, string operation, string entity)
    {
        _nomeEvento = entity + operation;

        Boolean.TryParse(Configuration["EventGridConfig:Enabled"], out var eventGridIsActive);
        if (!eventGridIsActive)
            return;

        var primaryTopicKey = Configuration["EventGridConfig:AcessKey"];
        var primaryTopic = Configuration["EventGridConfig:Endpoint"];

        var primaryTopicHostname = new Uri(primaryTopic).Host;

        var topicCredentials = new TopicCredentials(primaryTopicKey);
        var client = new EventGridClient(topicCredentials);

        client.PublishEventsAsync(primaryTopicHostname, GetEventsList(model)).GetAwaiter().GetResult();
    }

    private List<EventGridEvent> GetEventsList<T>(T model)
    {
        return new List<EventGridEvent>
        {
            new EventGridEvent()
            {
                Id = Guid.NewGuid().ToString(),
                EventType = _nomeEvento,
                Data = model,
                EventTime = DateTime.Now,
                Subject = "MS_Clientes",
                DataVersion = "1.0",
            }
        }; …
Run Code Online (Sandbox Code Playgroud)

json azure azureservicebus json-deserialization azure-eventgrid

5
推荐指数
2
解决办法
2543
查看次数