RabbitMQ在实际项目中的应用
业务场景
说明:
由于一些原因不说明具体业务,大致的业务场景就是,模块A会给模块B发出消息 ,模块B更新本地缓存encache.并且模块B在项目中是集群部署。
选用交换机:
1、fanout 它会把所有的交换器上的消息路由到所有与该交换器邦定的队列中,不需要BindingKey生效
2、direct:它会把消息路由到BindingKey与RoutingKey完全匹配的队列中。
3、topic:是direct上的扩展,同样是利用RoutingKey与BindingKey相匹配,但是匹配规则不一样,支持模糊匹配。有如下的规
-
-
- RoutingKey为一个点号“.”分隔的字符串,每个被隔开的独立字符串即为一个单词,是匹配的单位;
- BindingKey和RoutingKey一样,也是"."分割的字符串;
- 但不同的是BindingKey,可以用“#”,“”进行类似于占位符的模糊匹配,“#”表示一个单词,""表示多个单词(也可以是零个)
-
4、headers:依赖发送消息内容中的hearders属性进行匹配,在绑定队列和交换器时指定一组键值对,这里的也就是headers,当发送消息到交换器时,RabbitMQ会获取到该消息的headers,通过比较会路由到相关队列中,这种交换器性能会很差,一般不会使用。
以上就是交换机类型 依照此场景一般我们会考虑到使用fanout 这种模式 (也可以使用direct)
详情见下图:
图示
实现
这里说明springboot 集成rabbitmq 并且使用direct模型交换机实现该业务场景 展示消费者的代码
pom.xml添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
application.proerties 添加交换机和路由配置
rabbitmq.admin.exchange=admin.billinfo
rabbitmq.admin.routingkey=admin.billinfo
添加RabbitmqConfig类
@Configuration
public class RabbitMqConfig {
private final Logger logger = LoggerFactory.getLogger(RabbitMqConfig.class);
@Value("${rabbitmq.admin.exchange}")
String adminExchange;
@Value("${rabbitmq.admin.routingkey}")
String adminRouteKey