我有一个node.js函数,需要针对我的应用程序上的每个订单执行该函数。在此函数中,我的应用程序从oracle数据库获取订单号,处理订单,然后在数据库中对该订单号加+1(由于该订单可能失败,因此需要在函数中进行最后处理,因此将不使用该编号)。
如果在时间T(异步)同时处理所有在时间T收到的订单,那么相同的订单号将用于多个订单,我不希望这样。
所以我用兔子试图纠正这种情况,因为这是一个队列。似乎进程按应有的顺序完成,但是第二个进程不等待第一个完成(确认),所以最后我遇到了相同的问题,即多次使用相同的订单号。
无论如何,我是否可以将队列配置为一次处理一封邮件?仅在已确认进程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 Queuing会很合适。参见node-oracledb documentation on AQ。