由于公司政策的原因,我们(我的小团队)过去无法使用队列管理器(唯一允许使用的是Websphere MQ,但没有预算)。我们已经使用数据库实现了队列。我们的应用程序是以.NET为中心的数据库。 最近,这已更改-我们可以使用ActiveMQ或Rabbit。我们已经开始考虑迁移队列,但尚未决定将使用哪个队列。
它看起来并不像最初看起来那么简单。 当我们使用业务密钥检查消息是否在队列中以避免重复时,我们很少遇到这种情况。例如:当不耐烦的用户两次发送信用卡申请(单击发送按钮两次)时,因为他尚未看到状态更改。我们对后端负责,我们无法控制客户端应用程序。
当前的实现方式是:获取用户名并在队列中搜索,如果最近一小时有人请求该用户获取信用卡。 在数据库中搜索非常容易。如果找到匹配项,则会引发异常,而不是将消息放入队列中。 我仍然不知道如何使用队列管理器来执行此操作,找不到任何有关此的信息。我只发现了一些有关使用消息ID的信息,但是在我们的情况下,重复消息将具有不同的消息。
是否可以使用某些业务数据检查消息是否已经在队列中?
答案 0 :(得分:0)
我的一所大学找到了解决方案。 当前,我们已经在具有以下数据的单个数据库表中实现了队列:msg_type,msg_key(这是我们需要唯一的业务密钥),msg_body,状态,request_time,processed_time,retry_count和error_code。
想法如下:该表将仅用于重复数据删除,而队列管理器仅用于排队(无重复数据删除功能)。
因此,我们将从表中删除不必要的数据。其余字段为:msg_type和msg_key。
算法:
我们的服务收到请求
检查是否使用表中的业务密钥重复了该消息。如果是,则会引发异常。
将消息放入队列中,并将新消息密钥放入表中
这只是一个想法。尚未实施。这个简单的模型很可能需要一些修复。