当前位置: 首页 > 知识库问答 >
问题:

服务巴士排队噩梦。消息消失

蓝恩
2023-03-14

我们正在两个不同的实例上运行云服务。这个云服务在服务总线队列上旋转一个接收器。此接收器配置为:1。窥视并锁定模式2。自动完成=真3。RenewLockTimeout=10分钟4。MaxConcurrentMessages=1 5。PrefetchCount=默认值(应为0)

几天前,Azure决定更新我们的实例。我从日志中看到,在18.18时,第一个实例被请求停止。在18.24时,该实例停止,并在18.27时重新联机。在18.28,第二个实例被要求停止,在18.35,它恢复在线。

已在18.23排队收到7封邮件。其中一个在DB上生成了预期的记录(即成功执行了处理程序)。另外6个,没有。死信队列已启用,但为空。

理论上,我的代码应该在角色进入OnStop方法后立即停止接收消息。取消令牌被取消,消息处理程序被“暂停”,导致10分钟的延迟(因此,据我所知,消息不应该完成,然后应该再次处理)。所以我不能说第一条消息是被第一台还是第二台机器处理了。但已经处理过了。我敢肯定其他六个人也在排队。

共有1个答案

葛桐
2023-03-14

我们知道,接收者可以用两种不同的方式从服务总线队列读取消息:ReceiveAndDelete和peek-lock。ReceiveAndDelete模式,如果接收者在完成处理消息之前崩溃,则消息将丢失。Peek-lock模式,如果接收方在完成处理消息之前崩溃,没有完成消息,消息不会丢失/消失。

就像其他人说的,看不到你的代码,很难找到问题所在。如果可能,请修改代码,将OnMessageOptions.AutoComplete属性设置为false,并在接收方完成处理消息并在DB上创建记录后显式调用Complete(),然后检查是否可以解决问题。

 类似资料:
  • 我正在为Azure服务总线使用最新的Java绑定(V3.1.3):https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/servicebus 当我创建一个新的队列客户端,计划一条消息,然后取消它... ...代码似乎按预期工作:活动消息计数变为0。但是一旦被调度的消息到达它应该被调度的时间(我测试了10秒和100秒以后),消息有时会

  • 我有一个windows服务,它侦听Azure服务总线队列消息,以便从我的WebApi应用程序分发处理。此外,我还需要处理重复性任务(每晚/每周),我认为最好使用相同的系统来处理这些任务。 例如,假设我有一个“CleanupDb”队列,每天午夜删除过时的DB节点: 理论上这应该行得通,但我觉得我错过了一个更明显的处理方法。有没有更好的办法?

  • 为什么已经拥有了共享内存时需要消息队列呢? 这将是多种原因,让我们将其分解为多个点来简化 - 据了解,一旦消息被一个进程接收到,它将不再可用于任何其他进程。 而在共享内存中,数据可供多个进程访问。 如果想使用小信息格式进行通信。 当多个进程同时进行通信时,共享内存数据需要同步保护。 使用共享内存的写入和读取频率很高,那么实现功能将会非常复杂。 在这种情况下不值得使用。 如果所有的进程不需要访问共享

  • 一、消息模型 点对点 发布/订阅 二、使用场景 异步处理 流量削锋 应用解耦 三、可靠性 发送端的可靠性 接收端的可靠性 参考资料 一、消息模型 点对点 消息生产者向消息队列中发送了一个消息之后,只能被一个消费者消费一次。 发布/订阅 消息生产者向频道发送一个消息之后,多个消费者可以从该频道订阅到这条消息并消费。 发布与订阅模式和观察者模式有以下不同: 观察者模式中,观察者和主题都知道对方的存在;

  • 一个线程会从消息队列中收取消息,另一个线程会定时给消息队列发送普通消息和紧急消息 一个线程会从消息队列中收取消息,另一个线程会定时给消息队列发送普通消息和紧急消息 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: *

  • 消息队列接口 结构体 struct   rt_messagequeue   消息队列控制块 更多...   类型定义 typedef struct rt_messagequeue *  rt_mq_t   消息队列类型指针定义   函数 rt_err_t  rt_mq_init (rt_mq_t mq, const char *name, void *msgpool, rt_size_t msg_