通过事件总线发送池对象

时间:2018-09-17 14:21:52

标签: netty vert.x

我在Vert.x Verticle中汇集了一些创建昂贵的对象,我想通过事件总线将它们发送到另一个Verticle。当我这样做时,是否有一种方法(处理程序)告诉我该对象已被写入行中,因此我可以重置它并返回到池中?

在Netty(在Vert.x中使用)中,ByteBufretain()调用,即使使用异步设计也不再需要触摸它们。我可以在Vert.x中使用类似的东西吗?

1 个答案:

答案 0 :(得分:1)

继续我所知道的,我认为这取决于使对象“昂贵”的原因。

如果可以将昂贵性归因于计算其内部值所需的资源,那么EventBus的内置请求-响应消息传递可能是合适的

(...假设对象不只是巨大的和/或深度嵌套的)

在发件人Verticle端:

  • 从池中获取昂贵的对象,并用它组成一个Message
  • 调用EventBus.send()的变体,该变体接受Handler来处理回复
  • 在回复处理程序中,将对象返回到池中

在接收方Verticle端:

  • MessageConsumer注册一个新的EventBus,以接收来自发件人的消息
  • 当新的Message到达时,处理昂贵的对象,然后调用Message.reply()的某些变体来表示接收方的工作已完成

如果昂贵程度可以归因于对象的大小/复杂度,则共享数据可能是在EventBus上对它进行反序列化的更好选择。

如果您不熟悉共享地图功能,可以在docs中进行阅读。

走这条路线与上述方法相同,除了以下例外:

  • 代替序列化昂贵的对象,将其保存在共享地图中
  • 将存储对象的关联密钥发送到接收者Verticle

我不确定是否有针对您的问题的更框架就绪的惯用解决方案,但如果没有其他希望,我希望它能激发一些新的想法。