如何设计包含大量数据的JMS消息

时间:2013-03-27 15:02:52

标签: java database jms

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

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

  • 创建这样的打包邮件的最佳方法是什么?我认为我的选择是StreamMessageByteMessageObjectMessage。我排除了文本和地图消息,因为第一个将需要文本解析,这将破坏性能,我认为第二个似乎不适合该场景。我有点倾向于StreamMessage,因为它看起来相当紧凑,虽然它需要大量的工作来编写自定义序列化代码(对于ByteMessage来说更糟糕)。不确定ObjectMessage,它是如何执行的?是否有开箱即用的解决方案?
  • 每封邮件允许的最大大小是多少?它可能是数百KB甚至几MB的数量级吗?

感谢您的想法!

乔瓦尼

2 个答案:

答案 0 :(得分:2)

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

队列:

  1. 将通知消息发布到“通知队列”以指示应该开始处理
  2. 将命令消息发布到“命令队列”,并将相关ID设置为通知消息消息id(如果队列深度过高,则可以使用多个命令队列)
  3. 提交交易
  4. 处理:

    1. 从“通知队列”(例如,使用消息驱动的bean)接收通知消息
    2. 使用消息选择器
    3. 接收并处理来自“命令队列”的所有相关消息
    4. 提交交易

答案 1 :(得分:0)

使用字节(例如ByteMessage)可能是内存密集度较低的。

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

我们很高兴在消息传递系统中使用Kryo,但您有很多其他选择,例如流行的Google Protocol Buffers