【问题标题】:How to design a JMS message containing large amounts of data如何设计包含大量数据的 JMS 消息
【发布时间】:2013-03-29 03:08:24
【问题描述】:

我正在设计一个系统,该系统使用 ETL 工具来检索批量数据,即插入/更新/删除一个或多个表,并将它们放在 JMS 主题上,以便稍后由多个客户端处理。现在,关于主题的每条消息都代表一条记录 I/U/D,我们有一条特殊消息来分隔批处理的结束。在单个事务中处理批次很重要,因此由一个特殊的消息分隔一堆消息并不理想:会话发布和接收消息都必须针对多条消息进行设计;批处理分隔符消息是一个混乱的解决方案(每次我们收到一条消息,我们都需要检查它是否是最后一条消息)并且非常容易出错;系统难以调试和维护;该主题的消息数量很快就会变得庞大(高达数百万)。

现在,我认为改进架构的下一个自然步骤是将所有记录打包在单个 JMS 消息中,这样当接收到消息时,它包含单个事务,很容易检测到故障,没有关于主题的“孤儿”记录等。我只看到这样做的好处!现在这是我的问题:

  • 创建这样一个打包消息的最佳方式是什么?我认为我的选择是StreamMessageByteMessageObjectMessage。我排除了文本和地图消息,因为第一个需要文本解析,这会降低性能,我认为第二个似乎并不适合这种情况。我有点倾向于StreamMessage,因为它看起来非常紧凑,尽管它需要大量的工作来编写自定义序列化代码(对于 ByteMessage 更糟)。不确定 ObjectMessage,它是如何执行的?是否有开箱即用的解决方案?
  • 每条消息允许的最大大小是多少?它可能是数百 KB 甚至几 MB 的数量级吗?

感谢您的想法!

乔凡尼

【问题讨论】:

  • 您是否需要通过 JMS 传输所有数据(出于基础架构的原因),或者您是否可以将所有数据放入具有给定 batchID 的数据库表中,然后发送该 BatchID 通过 JMS 并让客户端从数据库中读取数据?
  • 不行,一切都要经过JMS。
  • 我的 2 美分:如果您的消息是 Java 对象,则使用字节(例如 ByteMessage)可能是您可以与快速且字节有效的序列化/反序列化库(如Kryo)结合使用的内存密集度较低的对象
  • @BGR 我会调查一下,谢谢!
  • @Giodude 我会将我的评论作为答案,以便其他人有机会轻松评论它

标签: java database jms


【解决方案1】:

您可以使用两个(或更多)队列、相关 ID 和一个消息选择器,而不是使用一条大消息。

排队:

  1. 将通知消息发布到“通知队列”以指示应开始处理
  2. 将命令消息发布到“命令队列”,相关 ID 设置为通知消息消息 ID(如果队列深度太高,您可以使用多个命令队列)
  3. 提交事务

处理:

  1. 从“通知队列”接收通知消息(例如使用消息驱动 bean)
  2. 使用消息选择器从“命令队列”接收和处理所有相关消息
  3. 提交事务

【讨论】:

  • Sami,这是一个非常有趣的方法。干净多了。我一定会考虑的。唯一的问题是它仍然需要一个跨越多条消息的会话,并且数据仍然被分成多个部分,这在某些情况下很容易出错。
  • 如果处理不当,通知消息的重新发送可能会导致一些问题。因此通知消息应该包含预期的命令消息的数量。如果接收到的命令消息数不等于这个数,事务应该回滚。如果事先不知道命令消息的数量,也可以在命令消息之后发送通知消息(自己生成唯一的关联 id 并在通知消息中提供)
  • 萨米,这很聪明。您将在哪里存储预期的命令消息数量?只是在通知消息的正文中?感谢您的帮助。
  • 是的,邮件正文是最好的地方。我会使用短信,因为它更容易使用(在解决生产中的错误时)
  • 只是一个小更新:我们决定在一条消息中序列化一批数据,并且可能会使用 Avro。
【解决方案2】:

使用字节(例如 ByteMessage)可能会占用较少的内存。

如果您操作 Java 对象,则可以使用快速且字节有效的序列化/反序列化库,例如 Kryo

我们很乐意在消息系统的生产环境中使用 Kryo,但您还有很多替代品,例如流行的 Google Protocol Buffers

【讨论】:

  • 只是补充一点,我正在查看 Avro (avro.apache.org) 进行序列化。与 java 序列化相比,它的性能非常好。
猜你喜欢
  • 2013-05-16
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 2010-12-08
相关资源
最近更新 更多