1.什么是消息驱动
消息驱动就是屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型。目前仅支持RabbitMQ、Kafka。
2.消息中间件有什么问题,stream靠什么实现?
如果我们项目用到了RabbitMQ和Kafka,由于这两个消息中间件的架构上的不同,之前的业务都是使用的rabbitmq,但是现在想往kafka进行迁移,这样一大堆东西都要重新做,很麻烦。
Stream通过定义绑定器Binder作为中间层,实现了应用程序与消息中间件细节之间的隔离。Binder可以动态的改变消息类型(kafka的topic,RabbitMq的exchange),也可以生成Binding,Binding用来绑定消息容器的生产者和消费者,它有两种类型,INPUT和OUTPUT,INPUT对应于消费者,OUTPUT对应于生产者。如下图(以RabbitMQ举例):
Source代表的就是往通道放入消息,Sink代表从通道取出信息,通过@EnableBinding注解与Channel绑定到一起。
3.分组消费与持久化问题
3.1分组消费
我们配置了8001为生产者,8002和8003为消费者,通过测试我们发现,8001只发送了一份消息,但是8002和8003都能同时消费,原因是他们不是一个组别的,没有竞争。如下:
Queue studyExchange.anonymous.J4KZ16HmQICdqo3ohNQ4xQ 8002
Queue studyExchange.anonymous.K7TbP3ZfSJ2PYkg3EEKtQw 8003
我们在8002和8003的yml文件中添加group:atguiguA,使得两个消费者在同一个组中,这样一份消息只能被一个消费者拿到,采用轮询拿取。
3.2持久化问题
我们发现给消费端手动配置了group还有一个作用,生产者发送的消息到通道中,就算消费者没有启动,消息也会保留到通道,而配置了group的消费者启动后会去通道中拿消息,没有配置group的消费者则不会去读取。