Spring Cloud Stream 基于至少一次方法,这意味着在极少数情况下,重复消息可以到达端点
Spring Cloud Stream是否保留已接收消息的缓冲区?
《企业集成模式》中的IdempotentReceiver建议: 将接收器设计为幂等接收器,可以安全地多次接收同一条消息。
Spring Cloud Stream 是否可以控制使用者中的重复消息?
更新:
Spring Cloud Stream中的一段说:
4.5.1。耐用性 与Spring Cloud Stream公认的应用程序模型一致,消费者组订阅是持久的。也就是说,绑定器实现可确保组订阅是持久的,并且一旦创建了至少一个组订阅,该组将接收消息,即使在组中所有应用程序停止时发送消息也是如此。 匿名订阅本质上是非持久的。对于某些绑定器实现(例如RabbitMQ),可能具有非持久的组订阅。 通常,在将应用程序绑定到给定目标时,最好始终指定使用者组。扩展Spring Cloud Stream应用程序时,必须为其每个输入绑定指定使用者组。 这样做会阻止应用程序的实例接收重复的消息(除非需要这种行为,这是不寻常的)。
答案 0 :(得分:1)
我认为您对spring-cloud-stream-frame框架的责任的假设不正确。 简而言之,Spring-cloud-stream是一个框架,负责将开发人员提供的生产者/消费者连接并调整到spring-cloud-stream绑定程序(例如Kafka)公开的消息代理。 ,兔子,运动等)。 因此,连接到代理,从代理接收消息,反序列化,调用用户代码,序列化消息并将其发送回代理属于框架职责范围。因此,您可以将其视为纯粹的基础架构。
您所描述的更多是与应用程序有关的,因为实际接收者是用户将作为Spring-cloud-stream开发经验的一部分开发的东西,因此,等幂性将由该用户承担。 另外,最重要的是,大多数代理已经通过确保仅发送一次特定消息来处理幂等性。就是说,如果有人向该代理发送相同的消息,它将不知道该消息是重复的,因此对幂等和/或重复数据删除的要求仍然有效,但是如您所见,给定因素数量,它并不是那么简单在发挥作用时,您对幂等的理解可能与我的不同,因此我们的方法也可能有所不同。 最后一件事(部分证明我的观点):可以安全地多次接收相同的消息。-这是所有陈述的内容,但是安全对您真正意味着什么对我对其他人?
答案 1 :(得分:1)
如果您担心应用程序从代理接收并处理消息但在确认消息之前崩溃的情况,则可能发生。 Spring云流应用程序启动器提供了对自动message metadata store的自动配置的支持,该IdempotentReceiverInterceptor支持Spring Integration的SFTP source app starter。 {{3}}中就是一个例子。默认情况下,sftp源使用内存中的元数据存储,因此它在重启后将无法生存,但可以进行自定义以使用持久性存储。