消息队列 | 青训营笔记

68 阅读2分钟
消息队列对于业务解耦、削峰和异步操作都有十分重要的意义。

从消息队列的本质来说是个队列,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;
    }
}