如何使用可靠的异步消息可靠地解析和存储数据?

时间:2011-09-12 03:59:27

标签: wcf jms msmq messaging apache-camel

我正在开发一个系统,该系统接收与医院中患者活动相关的消息,解析并存储该数据(HL7 2.x消息)。 有些消息可能包含基本的患者信息,其他消息可能包含实验室结果,转录文档等。

我想使用异步可靠的消息系统来完成这项工作(例如WCF + MSMQ或Apache Camel + ActiveMQ。看起来这些技术似乎很合适。

我无法理解如何应用这些技术来解决问题。 如果在为患者解析和存储数据时出现消息并出现问题,我需要暂停处理该患者的传入消息,直到问题得到解决。

如果出现问题,我真的不想停止为所有患者处理消息,只是针对有问题的单个患者的消息。

是否有设计模式或某种处理此类情况的方法我不知道?

我很可能会使用数据库来存储消息并跟踪个别患者队列。如果发生错误,我可以锁定患者,以便在问题解决之前不再处理消息。

我只是在寻找理智检查。有没有更简单的方法,或者手动管理数据库中的队列和患者是解决这个问题的合理方法?

4 个答案:

答案 0 :(得分:4)

这与客户最近的要求非常相似,以下是我们在Camel / ActiveMQ中解决这个问题的方法......

  • 将ActiveMQ message groups用于给定患者的单线程处理(保留顺序等)并仍然允许多线程处理
  • 设置Camel exception handling,以便在发生处理错误时将患者添加到例外列表(存储在HazelcastCache中)
  • 使用Camel filter将例外列表患者的消息路由到异常队列
  • 设置计时器以定期重试来自异常队列的消息
  • 在发生异常时设置电子邮件通知(如果此数量很大,请使用aggregator将邮件分组为较少的电子邮件等。)
  • 使用ActiveMQ JMX手动查看/重试/移动/删除邮件以对其进行适当分类(构建基于Web的控制台以支持此操作)

答案 1 :(得分:1)

您可以使用基于内容的路由器 http://camel.apache.org/content-based-router.html

然后将“麻烦病人”的消息路由到特殊队列。对于没有问题的患者,您可以照常处理。

然后,当患者“固定”时,您可以使用JMS选择器从“故障队列”中取出该患者的消息并将其放回常规队列,以便对其进行重新处理。

答案 2 :(得分:0)

如何处理特定患者ID的失败。

每位患者都有一个消息队列,根本无法扩展。您可能有1000名患者,因此您需要保持相同数量的队列。恶梦。

因此,要在同一队列中处理多个患者记录,您需要使从您队列中读取的服务具有容错能力。

我的意思是,如果服务无法处理出队消息(可能是由于消息的数据问题或下游依赖项不可用),那么该服务可以执行以下一项或多项操作:

  1. 重试配置的次数(使用配置的频率)
  2. 将该消息以及任何错误/诊断信息路由到另一个消息队列或另一个进程。
  3. 不执行任何操作,并允许邮件的生存时间超时,以便排队系统将其作为错误消息处理(不推荐)。
  4. 如果您要求始终按顺序处理单个患者的消息,那么您将面临不同的挑战,并且需要在允许对每个消息进行处理之前对其执行go / no-go查找。这是标准的有序交付实施。

    希望这会有所帮助。

    我想也许你应该重新发布一个新问题或多个问题,以便面对更具针对性的挑战。我觉得你现在面临着多重挑战。

答案 3 :(得分:0)

http://ignaciosuay.com/unit-testing-hl7-messages-with-apache-camel/I会建议您使用带有重新传递选项的activemq和camel。因此,如果出现问题,您的消息将被重新发送,直到消息将被处理。此外,您可以指定可以重新发送的次数。请看一下骆驼redilvery政策:

http://camel.apache.org/redeliverypolicy.html

另外,我编写了一个简单的测试示例,使用camel和hl7,这可能会对你有所帮助:

http://ignaciosuay.com/unit-testing-hl7-messages-with-apache-camel/