消息队列对于业务解耦、削峰和异步操作都有十分重要的意义。
从消息队列的本质来说是个队列,FIFO先入先出,只不过队列中存放的内容是message而已。其主要用途:不同进程线程之间通信。 MQ框架非常多,比较流行的有RabbitMq、ActiveMq、ZeroMq、kafka,以及阿里开源的RocketMQ。
每种消息队列有不同的优点。
最早出现的是kafka,同时他也是最早商用的。时效性:ms级,可用性:非常高,kafka是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用。但是使用短轮询方式,实时性取决于轮询间隔时间,消费失败不支持重试。而RabbitMq是支持云原生的消息队列,秒杀、抢红包、分布式定时任务经常用,RabbitMQ确实吞吐量会低一些,这是因为他做的实现机制比较重。
消息队列分为生产者和消费者。
生产者将消息发送到队列,消费者从队列中获取消息。同时,大多数消息队列会分为消息集群(Clustering),由多个 MQ 组成一个集群,进行分布式消息传递。Broker,中文叫做代理,因为MQ服务器帮我们对消息做了存储和转发。一般情况下为了保证服务的高可用,需要多个Broker。 对于RabittMQ在Java项目中的使用需要首先引入依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.4.1</version>
</dependency>
然后通过GetConnection函数对消息队列进行链接,连接后就可以使用消息队列在生产者和消费者之间进行消息交换。
public class ConnectionUtil {
public static Connection getConnection() throws Exception {
//定义连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置服务地址
factory.setHost("localhost");
//端口
factory.setPort(5672);
//设置账号信息,用户名、密码、vhost
factory.setVirtualHost("testhost");
factory.setUsername("admin");
factory.setPassword("admin");
// 通过工程获取连接
Connection connection = factory.newConnection();
return connection;
}
}