我的函数是处理来自队列服务的事件。
队列中的每个消息都将包含一个唯一的ID,并且希望具有相同ID的消息只处理一次。队列中可能会有多个相同的消息。
为了防止这种情况,我将函数逻辑定义为:
uniqueId = deserialize_queue_message();
if (check_in_progress(uniqueId))
throw;
set_in_progress(uniqueId);
do_work();
字符串
函数缩放是我担心的:如果两个示例同时开始执行,它们都将通过check_in_progress(uniqueId)
条件并继续执行do_work()
,这将导致重复的消息处理。
对此,通常的做法是什么?我如何才能防止这个问题 * 同时 *?
我正在考虑在数据库级别添加一个唯一的约束,这样对(uniqueID,in_progress),所以在set_in_progress(uniqueId)
步骤中抛出异常,但这迫使我在同一个数据库表中拥有uniqueID和in_progress,如果可能的话,我想避免这种情况。
1条答案
按热度按时间5kgi1eie1#
如果您可以接受5分钟的ID重复数据消除窗口,则可以尝试使用SQS FIFO,它可保证仅一次交付,并具有重复数据消除逻辑(重复数据消除间隔为5分钟)