当前位置: 首页 > 知识库问答 >
问题:

按特定顺序处理异步通知

南宫建白
2023-03-14

我正在使用javax。servlet获取关于用户完成的付款状态的异步通知。每个通知都包含需要在数据库中更新的信息,例如-用户详细信息、支付金额、付款id、付款状态等。。。

例如,id=1的一次付款的一组通知:

{user_msisdn='',      amount_paid=0.00, payment_id = 1, payment_state=NEW}
{user_msisdn=0012345, amount_paid=0.00, payment_id = 1, payment_state=PENDING}
{user_msisdn=0012345, amount_paid=2.00, payment_id = 1, payment_state=COMPLETED}

即使通知是异步的,数据库更新也必须是有序的,所以当我更新我的支付表时,id=1的支付条目必须首先更新为状态“新”,然后更新为“PENDING”,然后更新为“COMPLETED”。
其他一些内部操作是在我的代码中为每个payment_state完成的,所以这不仅仅是关于事务管理。

我的问题是,有时这些通知以毫秒为间隔到达,在这种情况下,当所需的操作(例如“NEW”通知)尚未完成,然后“PENDING”到达时,可能会先用“PENDING”状态更新数据库,然后用“NEW”覆盖数据库。。。

我正在寻找一种解决方案,它将同时处理不同付款ID的通知,但具有相同付款ID的通知以相同的顺序依次收到。

  • 当前的实现是围绕通知处理方法使用Aspect,它可以防止同时执行对同一payment_id的调用。
  • 我想过使用ActiveMQ,但是我必须为每个payment_id创建队列/主题,这太多了。
  • 我也读了一些关于Spring Retor的文章,但我不确定我是否可以为每个payment_id动态创建一个调度程序
  • 也许在payment_id上使用一些锁,这将阻止具有相同payment_id的其他通知被处理,直到完成?
  • 还有其他想法吗?

谢谢你!

共有1个答案

华凌
2023-03-14

请看看生产者-消费者的概念

wiki/Producer–consumer\u问题

生产者-消费者-模式

如果您必须以特定顺序处理事件,您应该考虑消费者,如果您的订单要求不适合,它能够对传入事件进行排序/忽略。

如果您发现一个中断的订单,如PENDING is before NEW,则将PENDING再次添加到队列的末尾。下一个将是新的,您可以执行。下一个传入操作已完成,但由于尚未调用PENDING,因此您将COMPLETE也放在队列的末尾,并且顺序有效。

当然,你必须注意遗漏事件。否则,您会有总是无缘无故地再次添加的事件,但这是一种特殊的错误处理逻辑。

 类似资料:
  • 我每个websocket接收几十条消息,这些消息可能只差几毫秒就能到达。我需要用操作来处理这些数据,这些操作有时会花费一些时间(例如,在DB中的插入)。为了处理接收到的新消息,必须完成对前一个消息的处理。 我的第一个想法是用Node.js Bull(用Redis)准备一个队列,但恐怕太长了,无法运行。这些消息的处理必须保持快速。 我尝试使用JS迭代器/生成器(直到现在我还从未使用过),我测试了如下

  • 这是我的Spring Batch管理控制台显示的内容的副本: 步名..读..写..提交..回滚..持续时间..状态 step2................................................................................ 谢谢

  • 问题内容: 我正在使用Node.js运行服务器,并且需要从正在运行的另一台服务器()请求数据。我需要向数据服务器发出许多请求(〜200)并收集数据(响应大小从〜20Kb到〜20Mb不等)。每个请求都是独立的,我想将响应保存为以下形式的一个巨大数组: 请注意,项目的顺序并不重要,理想情况下,它们应该以数据可用的顺序填充数组。 现在,当运行该程序时,它将显示: 现在,由于文件的大小如此可变,我期望它可

  • 我这里的问题是,获取promise在当前文本之前创建了几个字符,然后在最后创建的promise之后解析。我需要解决的最后一个promise的最新或取消以前的promise时,我改变了文本。 我希望结果总是最新的。 我查找了一些搜索栏示例,但什么也没找到。 我很确定解决方案是保存以前的promise,如果在你创建一个新promise时它仍然悬而未决,就取消它,但是我不知道如何取消promise。 谢

  • 我的完成处理程序有问题。下面是一个带有完成处理程序的函数,位于一个实用程序文件中: 我在视图控制器中调用它 输出清楚地表明该函数在运行该块之前没有等待完成: 我如何解决这个问题?

  • 通常,您可以有多个进程,但有时在某些操作中,我们需要确保在执行前一个进程之后执行一个进程。 我们如何在卡蒙达实现它?试图找到类似进程依赖关系的东西(因此进程在上一个进程完成后才开始),但找不到任何东西:( 我考虑在process中添加一些变量(比如),并检查指定的process是否已经完成,但也许会有更好的解决方案。