当前位置: 首页 > 知识库问答 >
问题:

使用Spring Cloud Stream,我应该为每个事件类型配置通道吗?

史承福
2023-03-14

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

对于一些异步通信,我使用Spring Cloud Stream来生成和使用事件。e、 g.在合同服务中起草业务合同后,该服务发布一个合同创建事件,该事件将由审计服务使用,以初始化审计过程。此外,用户服务将使用该事件为相关方创建通知。

场景是我有很多事件,消费者会根据事件类型订阅感兴趣的事件。我的问题是,我有许多事件类型,很快,我的配置文件中就会充斥着通道配置。例如

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. David Turanski!有一个示例将按类型选择性地使用事件。这是一个很好的解决方案,但我在想,Spring Cloud Stream有原生解决方案吗?
  2. 我应该使用Apache Camel还是Spring Integr?我没有复杂的路由规则,这些框架看起来像是矫枉过正。

我在信息传递方面是个新手,希望这里的人们能给我指明一个正确的方向。

共有2个答案

壤驷喜
2023-03-14

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

邵畅
2023-03-14

这真的要看情况,我很抱歉以这个开头回答。

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

另一个用例是事件源类型,其中大多数消费者只对事件的子集感兴趣,您可能会更好地将事件(或更好的聚合根)放置在每个目标上。这将允许您更好地扩展,并避免经纪人与消费者之间不必要的聊天。

在您的示例中,您可以使用以下内容:

public interface Contracts {

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

} 

这会为每个eventType创建一个主题,可能有点过头了

也许您应该创建一个类型为的接口事件,并让事件从中派生出来,然后改为:

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){

    }

 类似资料:
  • 我正在使用Netty框架并实现客户端和服务器。我建立了多达1000个连接。我想在多个地方配置超时值。其中一些我能理解。下面是我的netty实现的netty行为: 1。许多异步连接都是从具有超时的客户端开始的(使用ChannelOption.CONNECT\u timeout\u MILLIS配置) 2。那些能够连接的客户端连接使用channelActive发送HTTP请求,并使用channelRe

  • 你认为这是个好办法吗?你跟着什么?建议用什么来实现不同的事务类型?此外,如何对不同的事务类型实施不同的背书策略? 注意:我知道基于资产(或基于密钥)的认可策略(Fabric V1.4)可以用Chaincode编写。但这不允许我根据事务类型配置认可策略。

  • 问题内容: 我正在尝试决定要选择哪种mime类型来返回mp3数据(由php提供) 根据此mime类型列表:http : //www.webmaster-toolkit.com/mime-types.shtml 这些之间有什么区别,我应该使用哪个? 问题答案: 最好的选择是使用RFC定义的 mime-type 。

  • 我写了以下代码: 我只使用了一个useState在一个对象中存储“name”、“link”、“error”等属性。因为我想将FormObj和ValidateLink的逻辑保持在一起。所有三个属性仅使用一个useEffect。因此,我认为最好将所有三个属性都保留在useState中,而不是创建3个不同的useState。 但是我的经理和技术架构师告诉我要为每个属性创建3个useState,一个use

  • 使用StreamBridge,我将包含两种不同类型的对象的消息发送到单个Kafka主题。有没有办法定义一个能够使用两种类型消息的Spring Cloud Stream的功能消费者?

  • 我和dagger2合作有一段时间了。而且我也搞不清楚要不要为每个activity/片段创建一个自己的组件/模块。请帮我澄清一下: 比如我们有一个app,这个app大概有50个屏幕。我们将按照MVP模式和Dagger2为DI实现代码。假设我们有50个活动和50个主持人。 在我看来,通常我们应该这样组织代码: > 创建AppComponent和AppModule,它们将提供应用程序打开时使用的所有对象