【发布时间】:2013-03-29 03:08:24
【问题描述】:
我正在设计一个系统,该系统使用 ETL 工具来检索批量数据,即插入/更新/删除一个或多个表,并将它们放在 JMS 主题上,以便稍后由多个客户端处理。现在,关于主题的每条消息都代表一条记录 I/U/D,我们有一条特殊消息来分隔批处理的结束。在单个事务中处理批次很重要,因此由一个特殊的消息分隔一堆消息并不理想:会话发布和接收消息都必须针对多条消息进行设计;批处理分隔符消息是一个混乱的解决方案(每次我们收到一条消息,我们都需要检查它是否是最后一条消息)并且非常容易出错;系统难以调试和维护;该主题的消息数量很快就会变得庞大(高达数百万)。
现在,我认为改进架构的下一个自然步骤是将所有记录打包在单个 JMS 消息中,这样当接收到消息时,它包含单个事务,很容易检测到故障,没有关于主题的“孤儿”记录等。我只看到这样做的好处!现在这是我的问题:
- 创建这样一个打包消息的最佳方式是什么?我认为我的选择是
StreamMessage、ByteMessage或ObjectMessage。我排除了文本和地图消息,因为第一个需要文本解析,这会降低性能,我认为第二个似乎并不适合这种情况。我有点倾向于StreamMessage,因为它看起来非常紧凑,尽管它需要大量的工作来编写自定义序列化代码(对于 ByteMessage 更糟)。不确定 ObjectMessage,它是如何执行的?是否有开箱即用的解决方案? - 每条消息允许的最大大小是多少?它可能是数百 KB 甚至几 MB 的数量级吗?
感谢您的想法!
乔凡尼
【问题讨论】:
-
您是否需要通过 JMS 传输所有数据(出于基础架构的原因),或者您是否可以将所有数据放入具有给定 batchID 的数据库表中,然后发送该 BatchID 通过 JMS 并让客户端从数据库中读取数据?
-
不行,一切都要经过JMS。
-
我的 2 美分:如果您的消息是 Java 对象,则使用字节(例如 ByteMessage)可能是您可以与快速且字节有效的序列化/反序列化库(如Kryo)结合使用的内存密集度较低的对象
-
@BGR 我会调查一下,谢谢!
-
@Giodude 我会将我的评论作为答案,以便其他人有机会轻松评论它