【问题标题】:How to use synchronous messages on rabbit queue?如何在rabbitmq队列上使用同步消息?
【发布时间】:2020-08-31 10:34:06
【问题描述】:

我有一个 node.js 函数需要为我的应用程序上的每个订单执行。在此函数中,我的应用程序从 oracle 数据库中获取订单号,处理订单,然后将 + 1 添加到数据库上的该数字(需要是函数的最后一件事,因为订单可能会失败,因此不会使用该数字)。

如果在时间 T 收到的所有订单同时(异步)处理,那么相同的订单号将用于多个订单,我不希望这样。

所以我使用 rabbit 来尝试解决这种情况,因为它是一个队列。似乎流程按应有的顺序完成,但是第二个流程不会等待第一个流程完成(ack)开始,所以最后我遇到了多次使用相同订单号的相同问题.

我是否可以将队列配置为一次处理一条消息?只有在进程 n 被确认后才启动进程 n+1?

这对我来说是救命稻草!

【问题讨论】:

  • 我很困惑,让我们暂时将 RabbitMQ 排除在外。请更新问题,详细说明您的应用与 Oracle 之间的交互。 1)听起来您收到的订单会在您的应用程序中调用一个函数。我明白了 2) 这一点需要澄清:“处理订单,然后将 + 1 添加到数据库上的那个数字”。你要加 1 是什么?原来的号码是从哪里来的?数据库的一般流程是什么?在工作结束时只插入一个插页?在那之前你不需要订单号?
  • 你说,“很遗憾我不能,因为它是客户的数据库(我的应用程序应该与现有应用程序集成)”你是说你要插入到现有的订单表中有任何逻辑来管理订单号吗?我的猜测是你错了。您应该询问客户订单号是如何生成的。
  • 嗨,丹!是的,情况就像你说的那样,我正在插入一个现有的订单表,该表没有任何逻辑来管理订单号!...所以,我创建了一种控制订单处理和管理订单号的方法使用 Redis(因为确实没有对数据库进行管理)。当我把它展示给负责另一个应用程序的人时,他们根本不在乎......“它的工作原理就是这样,为什么现在改变?”......好吧,我想会有多个订单使用相同的号码我无能为力:(
  • 我觉得这里有误会。你能告诉我们表格的定义吗?你知道如何为它生成 DDL 吗?看到这个:stackoverflow.com/questions/26249892/…

标签: node.js asynchronous rabbitmq queue message-queue


【解决方案1】:

如果问题是为了避免重复的订单号,那么使用 Oracle 序列,或者在插入表时使用标识列来生成订单号:

CREATE TABLE mytab (
       id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY(START WITH 1),
       data VARCHAR2(20));
INSERT INTO mytab (data) VALUES ('abc');
INSERT INTO mytab (data) VALUES ('def');
SELECT * FROM mytab;

这将给出:

        ID DATA
---------- --------------------
         1 abc
         2 def

如果问题是您希望按顺序处理订单,那么在前一个订单完成之前不要从队列中拉出订单。这会限制您的吞吐量,因此您需要了解您的需求并做出一些架构决策。

总的来说,Oracle Advanced Queuing 听起来很合适。请参阅node-oracledb documentation on AQ

【讨论】:

  • 嗨克里斯托弗!是的,如果我可以对 oracle 进行更改,身份列会很好。不幸的是,我不能,因为它是客户的数据库(我的应用程序应该与现有应用程序集成)。我的印象是,rabbitmq 只会在第一条消息返回 ack 后才开始消费第二条消息(一旦订单过程完成就会发生这种情况),但似乎并非如此。
猜你喜欢
  • 2013-08-09
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
相关资源
最近更新 更多