我们目前正在Java项目中实现发布/订阅,我有一个问题,即发布对象应该存在多久.

大多数教程都相对简单,只是展示了以下模式:

  • 调用发布方法
  • 在创建发布者方法中
  • 发送一两条消息
  • 关闭出版商

这就是我们所复制的,一个以Message为参数的send()方法,为每条消息创建和关闭Publisher.

我们观察到,性能远远低于我们的预期(每秒30条消息).

现在我们正在考虑是否必须更改旧代码以允许成批发送消息,或者我们是否应该在服务处于活动状态的整个时间内保持发布者打开,或者可能将其保留在某个时间到期的缓存中.

为每条消息创建并关闭Publisher 是一种正常模式,还是应该让发布者活得更久?让Publisher在整个服务运行期间保持打开状态是可以的,还是会导致资源问题?

推荐答案

出版商应该长盛不衰.许多教程都是一些琐碎的例子,程序本身的生命周期相对较短,这就是为什么他们倾向于在消息发布后关闭出版商.如果为每条消息创建并关闭Publisher,则每次都需要重新创建连接,这将减慢发布速度.您也不能利用客户端库中的batching,它允许更高效地将消息发送到服务器.

Java相关问答推荐

Annotation @ Memphier无法正常工作,并表示:class需要一个bean,但找到了2个bean:

参数值[...]与预期类型java.util.Date不匹配

解析Javadoc时链接的全限定类名

现场观看Android Studio中的变化

什么是Java原子属性的正确getter和setter

使用UTC时区将startDatetime转换为本地时间

测试何时使用Mockito强制转换对象会导致ClassCastException

使用Room Database删除Jetpack合成中的所有项目后,UI未重新合成

将Spring Boot 3.2.0升级到3.2.1后查询执行错误

搜索列表返回多个频道

使用用户引入的参数生成人员数组

Java构造函数分支

在学习Spring时,通过构造函数参数0表达了不满意的依赖关系

如何将Pane的图像快照保存为BMP?

二进制数据的未知编码/序列化

为什么在下面的Java泛型方法中没有类型限制?

为什么我的登录终结点不能被任何请求访问?

Java返回生成器的实现

Springboot应用程序无法识别任何@RestController或@Service,我认为@Repository也无法识别

使用DynamoDB增强客户端时未更新属性