如何避免发送重复消息

How to avoid sending repeated messages

由于公司政策,我们(我的小团队)过去不能使用队列管理器(唯一允许的是 Websphere MQ,但没有预算)。我们已经使用数据库实现了队列。我们的应用程序以 .NET 中实现的数据库为中心。 最近这已经改变了——我们可以使用 ActiveMQ 或 Rabbit。我们已经开始考虑迁移我们的队列,但尚未决定使用哪个队列。

看来它并不像最初看起来那么简单。 当我们使用业务键检查消息是否在队列中以避免重复时,我们很少有场景。例如:当不耐烦的用户两次发送信用卡申请(发送按钮被点击两次)时,因为他还没有看到状态变化。我们负责后端,我们无法控制客户端应用程序。

当前的实现是:如果在最近一个小时内该用户请求获取信用卡,则获取用户名并在队列中搜索。 在数据库中搜索非常容易。如果找到匹配项,则引发异常而不是将消息放入队列。 我仍然不知道如何使用队列管理器执行此操作,我找不到任何相关信息。我只找到了一些关于使用消息 ID 的信息,但在我们的例子中,重复的消息会有不同的 ID。

是否可以使用一些业务数据检查消息是否已经在队列中?

我的一所大学找到了解决方案。 目前我们在单个数据库 table 中实现了队列,其中包含以下数据:msg_type、msg_key(这是我们需要唯一的业务键)、msg_body、状态、 request_time、processed_time、retry_count 和 error_code.

想法如下:此 table 仍将仅用于重复数据删除,队列管理器仅用于排队(无重复数据删除功能)。

所以我们将从 table 中删除不必要的数据。其余字段为:msg_type 和 msg_key.

算法:

  1. 我们的服务收到请求

  2. 检查消息是否与 table 中的业务键重复。如果是,则引发异常。

  3. 将消息放入队列并将新消息密钥放入table

这只是一个想法。它尚未实施。这个简单的模型很可能需要一些修复。