如何在兔子队列上使用同步消息?



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

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

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

无论如何,我可以将队列配置为一次处理一条消息吗?仅在确认进程 n 时才启动进程 n+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 Queueing是一个不错的选择。 请参阅 AQ 上的 node-oracledb 文档。

最新更新