0

我正在做一个项目,使用springboot、spring cloud netflix等来构建微服务。

对于一些异步通信,我使用 Spring Cloud Stream 来生成和使用事件。例如,在合同服务中起草了业务合同后,该服务会发布一个合同创建事件,该事件将被审计服务消费,以启动审计流程。此外,用户服务将使用该事件为相关方创建通知。

场景是我有很多事件,消费者会根据事件类型订阅感兴趣的事件。我遇到的问题是,我有很多事件类型,很快,我的配置文件就会被频道配置淹没。例如

spring.cloud.stream.bindings.creation.destination=contract-creation
spring.cloud.stream.bindings.revocation.destination=contract-revocation
spring.cloud.stream.bindings.termination.destination=contract-termination
...

我做错了什么?我正在考虑这些替代方案:

  1. 大卫图兰斯基!有一个示例,它将按类型选择性地使用事件。哪个是一个很好的解决方案,但我在想,Spring Cloud Stream 有原生解决方案吗?
  2. 我应该使用 Apache Camel 还是 Spring Integration?我没有复杂的路由规则,这些框架看起来有点矫枉过正。

我是消息传递方面的新手,希望这里的人们能给我指出正确的方向。

4

2 回答 2

3

这真的取决于,我很抱歉开始回答这个问题。

拥有一个带有选择器的通道是最简单的选择,但需要注意的是,每个消费者都会消费来自该目的地的所有消息。如果这是您的用例,那就去做吧。

另一个用例是事件溯源类型,其中大多数消费者只对事件的子集感兴趣,您可能会更好地将事件(或更好的聚合根)放在每个目的地上。这将使您能够更好地扩展,并避免从代理到消费者的不必要的闲聊。

在你的例子中,你可以有这样的东西:

public interface Contracts {

    @Output("contract-creation") MessageChannel creation();
    @Output("contract-revogation") MessageChannel revogation();
    @Output("contract-termination") MessageChannel termination();

} 

这将为每个事件类型创建一个主题,也许有点矫枉过正

也许您应该Event使用 a创建一个接口Type并让您的事件从它继承,然后改为:

public interface Events {
    @Output MessageChannel user();
    @Output MessageChannel contract();
}

现在,所有合约事件(创建、撤销、终止)都将转到同一个目的地。在接收端,您可以创建选择器来选择要应用的选择器:

@StreamListener(target = "contract", condition = "payload.type=='created'")
    public void contractCreated(@Payload ContractCreatedEvent){

    }

    @StreamListener(target = "contract", condition = "payload.type=='terminated'")
    public void contractTerminated(@Payload ContractTerminatedEvent){

    }
于 2017-07-19T09:51:40.153 回答
1

David 的博文中提到的condition表达式属性被烘焙到@StreamListener注解中,因此您可以将不同的事件类型从同一目的地路由到不同的侦听器。

于 2017-07-18T20:01:24.317 回答