【问题标题】:How can I reliably parse and store data using reliable asynchronous messages?如何使用可靠的异步消息可靠地解析和存储数据?
【发布时间】:2011-11-15 00:56:15
【问题描述】:

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

我想使用异步可靠的消息传递系统来执行此操作(例如 WCF + MSMQ 或 Apache Camel + ActiveMQ。看起来这些技术很适合。

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

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

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

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

我只是在寻找健全性检查。是否有更简单的方法来做到这一点,或者手动管理数据库中的队列和患者是否是解决此问题的合理方法?

【问题讨论】:

    标签: wcf jms msmq messaging apache-camel


    【解决方案1】:

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

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

    然后,当患者“修复”后,您可以使用 JMS 选择器从“问题队列”中提取该患者的消息并放回常规队列,以便重新处理它们。

    【讨论】:

      【解决方案2】:

      如何处理特定患者 ID 的故障。

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

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

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

      1. 重试配置的次数(使用配置的频率)
      2. 将该消息连同任何错误/诊断信息一起路由到另一个消息队列或另一个进程。
      3. 什么都不做,让消息的生存时间超时过期,以便排队系统将其作为坏消息处理(不推荐)。

      如果您要求始终按顺序处理单个患者的消息,那么您将面临不同的挑战,并且需要在允许处理每条消息之前对每条消息实施通过/不通过查找。这是一个标准的订购交付实现。

      希望这会有所帮助。

      我认为也许您应该重新发布一个新问题或多个问题,以解决您面临的更集中的挑战。我感觉你现在面临着多重挑战。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-28
            • 2021-01-19
            • 2021-11-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多