RabbitMq的使用

在分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦。
MQ特点:先进先出、发布订阅、持久化、分布式
Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。
RabbitMQ基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。
在这里插入图片描述

RabbitMQ服务端代码是使用并发式语言Erlang编写的,安装Rabbit MQ的前提是安装Erlang。去http://www.rabbitmq.com/download.html官网查看erlang和rabbitmq的对应版本号,下载正确的版本。

RabbitMq安装路径不能有中文,也不能有空格,否则会报错。
通过cmd进入rabbitmq_server-3.7.3\sbin路径,运行rabbitmq-plugins enable rabbitmq_management,再双击rabbitmq-server.bat
最后访问http://localhost:15672,进入登录页面,默认用户名密码guest

RabbitMQ的五种模式
1.简单队列(模式):一个生产者对应一个消费者
2.work模式:一个生产者对应多个消费者,但是只能有一个消费者获得消息!
3.发布/订阅模式:一个消费者将消息首先发送到交换器,交换器绑定多个队列,然后被监听该队列的消费者所接收并消费。交换器主要有四种类型:direct,fanout,topic,headers
4.路由模式:生产者将消息发送到direct交换器,在绑定队列和交换器的时候有一个路由key,生产者发送的消息会指定一个路由key,那么消息只会发送到相应key相同的队列,接着监听该队列的消费者消费信息。
5.主题模式:上面的路由模式是根据路由key进行完整的匹配(完全相等才发送消息),这里的通配符模式通俗的来讲就是模糊匹配。符号"#“表示匹配一个或多个词,符号”*"表示匹配一个词。

核心api是Connection 和Channel。
ConnectionFactory factory = new ConnectionFactory();
factory.setUsername(userName);
factory.setPassword(password);
factory.setVirtualHost(virtualHost);
factory.setHost(hostName);
factory.setPort(portNumber);
Connection conn = factory.newConnection();
或者
ConnectionFactory factory = new ConnectionFactory();
factory.setUri(“amqp://userName:password@hostName:portNumber/virtualHost”);
Connection conn = factory.newConnection();

Connection 用来生成Channel
Channel channel = conn.createChannel();
channel.close();
conn.close();

简单队列:product -----> queue -------> consumer

work模式:      		  
								  ------------>consumer1
                      			  |
product ----->  queue |
                      			  |
					 			  ------------->consumer2
					
发布订阅模式:
											---------->  queue1 ------> consumer1
			             				  |
product ----->  exchanges |
                         				 |
                         				 ----------->  queue2 ------> consumer2

交换器分为四种,分别是:direct、fanout、topic和 headers。
channel.exchangeDeclare(exchangeName, “direct”, true);
channel.queueDeclare(queueName, true, false, false, null);
channel.queueBind(queueName, exchangeName, routingKey);

声明队列绑定到交换器上
channel.exchangeDeclare(exchangeName, “direct”, true);
channel.queueDeclare(queueName, true, false, false, null);
channel.queueBind(queueName, exchangeName, routingKey);
删除队列
channel.queueDelete(“queue-name”)
channel.queueDelete(“queue-name”, false, true)

channel.queuePurge(“queue-name”)

发布消息
byte[] messageBodyBytes = “Hello, world!”.getBytes();
channel.basicPublish(exchangeName, routingKey, null, messageBodyBytes);
最简单实现consumer接口的方式是继承类DefaultConsumer
boolean autoAck = false;
channel.basicConsume(queueName, autoAck, “myConsumerTag”,
new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties,
byte[] body)
throws IOException
{
String routingKey = envelope.getRoutingKey();
String contentType = properties.getContentType();
long deliveryTag = envelope.getDeliveryTag();
// (process the message components here …)
channel.basicAck(deliveryTag, false);
}
});
Channel.basicAck消费确认
Channel.basicNack消费不成功
Channel.basicReject消费拒绝

分布式消息系统作为实现分布式系统可扩展、可伸缩性的关键组件,需要具有高吞吐量、高可用等特点。而谈到消息系统的设计,就回避不了两个问题:1、消息的顺序问题;2、消息的重复问题
解决消息重复的方法:1、消费端处理消息的业务逻辑保持幂等性;2、保证每条消息都有唯一编号且保证消息处理成功与去重表的日志同时出现
解决消息顺序的问题:通过合理的设计或者将问题分解来规避,问题本身不好解决。

springboot整合rabbitmq添加依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值