java - 将事件发布到单个微服务实例
问题描述
我正在开发一个项目,该项目具有多个事件驱动的微服务,并且还使用 Kubernetes 进行负载平衡。所有的服务都是发布者和听众。当微服务发布事件时,所有侦听器都在捕获事件(如果它侦听该特定事件)并完成他们的工作。在此之前,此流程没有问题:
假设我有一个负责发送电子邮件的微服务。由于负载高,此服务被负载均衡器复制了 2 次。现在我们有 3 个电子邮件服务实例。当发布“sendMail”事件时,所有 3 个实例都在捕获该事件并为自己发送一封电子邮件。在一天结束时,正在发送 3 封电子邮件。
我的问题是,我可以配置一个允许我为这两种情况发布事件的云总线。我想对一个事件说“当一个听众抓住你时,消失”或“去找每个在外面等着的听众”。
例如;
微服务:A、B、C
由负载均衡器复制:A1、A2、A3、B1...
案例 1:我想为所有服务的实例发布一个事件。
案例 2:我想为服务 A 实例发布一个事件。
案例 3:我想为 A 的单个实例发布一个事件(不在乎哪个)。
我努力了; 为事件提供目的地,但所有实例都具有相同的总线名称,因为它们重复相同。如果我给出/知道单个实例总线名称,我不会使用它,因为那个 pod 可能会死掉。
活动发布;
applicationContext().publishEvent(
new customEvent(
this, // Source
busProperties().getId(), // Origin Service
null // Destination Service (null: all)
)
);
事件监听器;
@Component
public class Listener implements ApplicationListener<CustomEvent> {
@Override
public void onApplicationEvent(CustomEvent event) {
Foo();
}
}
解决方案
推荐阅读
- symfony - 在没有 SonataUserBundle 的情况下构建后台
- css - 固定容器工作不良的覆盖属性
- php - Slim 框架:如何打破循环依赖注入?
- c++ - Boost Asio 异步操作调试断言问题
- python-3.x - 在 Django 3/Python 中,删除孤立记录的首选方法是什么?
- flutter - 在颤动中从 TextFormField 添加多个值
- java - 如何在java中制作通用ADT?
- node.js - 在 node:alpine 映像的 docker 中使用 docker
- html - CSS在对齐文本时考虑改变大小的动画
- c++ - 为什么我们不能把两个阅读线都放在while循环下?