Spring Cloud Stream
weixin_42073629
这个作者很懒,什么都没留下…
展开
-
Spring Cloud Stream:RabbitMQ延迟消息无效果,直接被消费
之前在写Spring Cloud Stream专题内容的时候,特地介绍了一下如何使用RabbitMQ的延迟消息来实现定时任务。最近正好因为开发碰到了使用过程中发现,延迟消息没有效果,消息直接就被消费了的情况。因此就继续深入研究了一下问题原因,在此记录下来,给碰到类似问题的童鞋们参考。问题定位因为不是所有的消息都出现了没有延迟消息效果的因素,通过有问题的消息特征,大致猜测可能是延迟时间过长导致了消息延迟失败。为了验证这个原因,先拿之前文章中的例子,来测试一下延迟时间是否与问题直接相关。对之前的延迟原创 2020-07-20 00:04:27 · 1272 阅读 · 0 评论 -
Spring Cloud Stream:使用延迟消息实现定时任务(RabbitMQ)
应用场景我们在使用一些开源调度系统(比如:elastic-job等)的时候,对于任务的执行时间通常都是有规律性的,可能是每隔半小时执行一次,或者每天凌晨一点执行一次。然而实际业务中还存在另外一种定时任务,它可能需要一些触发条件才开始定时,比如:编写博文时候,设置2小时之后发送。对于这些开始时间不确定的定时任务,我们也可以通过Spring Cloud Stream来很好的处理。为了实现开始时间不确定的定时任务触发,我们将引入延迟消息的使用。RabbitMQ中提供了关于延迟消息的插件,所以本文就来具体介原创 2020-07-20 00:04:06 · 556 阅读 · 0 评论 -
Spring Cloud Stream:同一通道根据消息内容分发不同的消费
应用场景有的时候,我们对于同一通道中的消息处理,会通过判断头信息或者消息内容来做一些差异化处理,比如:可能在消息头信息中带入消息版本号,然后通过if判断来执行不同的处理逻辑,其代码结构可能是这样的:@StreamListener(value = TestTopic.INPUT)public void receiveV1(String payload, @Header("version") String version) { if("1.0".equals(version)) {原创 2020-07-20 00:02:40 · 140 阅读 · 0 评论 -
Spring Cloud Stream:消费失败后的处理策略(四):重新入队(RabbitMQ)
应用场景之前我们已经通过《Spring Cloud Stream消费失败后的处理策略(一):自动重试》一文介绍了Spring Cloud Stream默认的消息重试功能。本文将介绍RabbitMQ的binder提供的另外一种重试功能:重新入队。动手试试准备一个会消费失败的例子,可以直接沿用前文的工程,也可以新建一个,然后创建如下代码的逻辑:@EnableBinding(TestApplication.TestTopic.class)@SpringBootApplicationpubli原创 2020-07-20 00:02:26 · 395 阅读 · 0 评论 -
Spring Cloud Stream:消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
应用场景前两天我们已经介绍了两种Spring Cloud Stream对消息失败的处理策略:自动重试:对于一些因环境原因(如:网络抖动等不稳定因素)引发的问题可以起到比较好的作用,提高消息处理的成功率。 自定义错误处理逻辑:如果业务上,消息处理失败之后有明确的降级逻辑可以弥补的,可以采用这种方式,但是2.0.x版本有Bug,2.1.x版本修复。那么如果代码本身存在逻辑错误,无论重试多少次都不可能成功,也没有具体的降级业务逻辑,之前在深入思考中讨论过,可以通过日志,或者降级逻辑记录的方式把错误消息原创 2020-07-19 23:32:13 · 314 阅读 · 0 评论 -
Spring Cloud Stream:消费失败后的处理策略(二):自定义错误处理逻辑
应用场景上一篇《Spring Cloud Stream消费失败后的处理策略(一):自动重试》介绍了默认就会生效的消息重试功能。对于一些因环境原因、网络抖动等不稳定因素引发的问题可以起到比较好的作用。但是对于诸如代码本身存在的逻辑错误等,无论重试多少次都不可能成功的问题,是无法修复的。对于这样的情况,前文中说了可以利用日志记录消息内容,配合告警来做补救,但是很显然,这样做非常原始,并且太过笨拙,处理复杂度过高。所以,我们需要需求更好的办法,本文将介绍针对该类问题的一种处理方法:自定义错误处理逻辑。动手原创 2020-07-19 23:27:46 · 135 阅读 · 0 评论 -
Spring Cloud Stream:消费失败后的处理策略(一):自动重试
首先,介绍一下Spring Cloud Stream中默认就已经配置了的一个异常解决方案:重试!应用场景依然要明确一点,任何解决方案都要结合具体的业务实现来确定,不要有了锤子看什么问题都是钉子。那么重试可以解决什么问题呢?由于重试的基础逻辑并不会改变,所以通常重试只能解决因环境不稳定等外在因素导致的失败情况,比如:当我们接收到某个消息之后,需要调用一个外部的Web Service做一些事情,这个时候如果与外部系统的网络出现了抖动,导致调用失败而抛出异常。这个时候,通过重试消息消费的具体逻辑,可能在下原创 2020-07-19 23:22:46 · 1157 阅读 · 0 评论 -
Spring Cloud Stream:如何消费自己生产的消息
在上一篇《Spring Cloud Stream如何处理消息重复消费》中,我们通过消费组的配置解决了多实例部署情况下消息重复消费这一入门时的常见问题。本文将继续说说在另外一个被经常问到的问题:如果微服务生产的消息自己也想要消费一份,应该如何实现呢?常见错误在放出标准答案前,先放出一个常见的错误姿势和告警信息(以便您可以通过搜索引擎找到这里^_^)。以下错误基于Spring Boot 2.0.5、Spring Cloud Finchley SR1。首先,根据入门示例,为了生产和消费消息,需要定义两原创 2020-07-19 21:09:49 · 166 阅读 · 0 评论 -
Spring Cloud Stream:如何处理消息重复消费
最近收到好几个类似的问题:使用Spring Cloud Stream操作RabbitMQ或Kafka的时候,出现消息重复消费的问题。通过沟通与排查下来主要还是用户对消费组的认识不够。那么什么是消费组呢?为什么要用消费组?它解决什么问题呢?摘录一段之前博文的内容,来解答这些疑问:通常在生产环境,我们的每个服务都不会以单节点的方式运行在生产环境,当同一个服务启动多个实例的时候,这些实例都会绑定到同一个消息通道的目标主题(Topic)上。默认情况下,当生产者发出一条消息到绑定通道上,这条消息会产生多个副本被原创 2020-07-19 21:00:58 · 879 阅读 · 1 评论 -
Spring Cloud Stream:消息驱动的微服务(消费分区)
通过上一篇《消息驱动的微服务(消费组)》的学习,我们已经能够在多实例环境下,保证同一消息只被一个消费者实例进行接收和处理。但是,对于一些特殊场景,除了要保证单一实例消费之外,还希望那些具备相同特征的消息都能够被同一个实例进行消费。这时候我们就需要对消息进行分区处理。使用消息分区在Spring Cloud Stream中实现消息分区非常简单,我们可以根据消费组示例做一些配置修改就能实现,具体如下:在消费者应用SinkReceiver中,我们对配置文件做一些修改,具体如下:spring.cl.原创 2020-07-19 20:55:58 · 273 阅读 · 0 评论 -
Spring Cloud Stream:消息驱动的微服务(消费组)
通过之前的《消息驱动的微服务(入门)》一文,相信很多朋友已经对Spring Cloud Stream有了一个初步的认识。但是,对于《消息驱动的微服务(核心概念)》一文中提到的一些核心概念可能还有些迷糊,下面我们将详细的来学习一下这些概念。本文我们就来学习和使用一下“消费组”这一概念。使用消费组实现消息消费的负载均衡通常在生产环境,我们的每个服务都不会以单节点的方式运行在生产环境,当同一个服务启动多个实例的时候,这些实例都会绑定到同一个消息通道的目标主题(Topic)上。默认情况下,当生产者发.原创 2020-07-19 20:52:55 · 195 阅读 · 0 评论 -
Spring Cloud Stream:消息驱动的微服务(核心概念)
通过《Spring Cloud Stream消息驱动的微服务(入门)》一文,相信大家对Spring Cloud Stream的工作模式已经有了一些基础概念,比如:输入、输出通道的绑定,通道消息事件的监听等。下面在本文中,我们将详细介绍一下Spring Cloud Stream中是如何通过定义一些基础概念来对各种不同的消息中间件做抽象的。下图是官方文档中对于Spring Cloud Stream应用模型的结构图。从中我们可以看到,Spring Cloud Stream构建的应用程序与消息中间件之间是通过绑原创 2020-07-19 20:48:14 · 186 阅读 · 0 评论 -
Spring Cloud Stream:消息驱动的微服务(入门)
之前在写Spring Boot基础教程的时候写过一篇《Spring Boot中使用RabbitMQ》。在该文中,我们通过简单的配置和注解就能实现向RabbitMQ中生产和消费消息。实际上我们使用的对RabbitMQ的starter就是通过Spring Cloud Stream中对RabbitMQ的支持来实现的。下面我们就通过本文来了解一下Spring Cloud Stream。Spring Cloud Stream是一个用来为微服务应用构建消息驱动能力的框架。它可以基于Spring Boot来创建独立的原创 2020-07-19 20:45:13 · 138 阅读 · 0 评论