消息队列的应用场景

1856db457f2d56bb9b41308a3c045105.png

消息队列是改变了服务之间调用的通信方式,使用消息队列可以极大的提供业务代码所花费的时间,在很多场景下,消息队列是非常好用的!

当前消息队列中间件的介绍

  1. Kafka 适用于大数量,对功能要求不高的应用场景
  2. RabbitMQ 适用于功能要求高、而且还注重公平调度原则的应用场景

什么是公平调度: 比如多条线程之间,可以非常公平的进行切换: A B A B...

  1. 没有中转站的ZeroMQ,该消息队列被设计成是一个Socket API

RabbitMQ详解

RabbitMQ的组成部分

生产者

生产消息的一方

消费者

消费消息的一方

交换机

交换机是用来决定消息发送到哪个队列上的。交换机也支持持久化、临时和自动删除。在RabbitMQ的交换机中有四种类型:direct、fanout、topic、header

4)队列

基于先进先出的原则,具有缓存消息的功能,而且支持持久化、临时、自动删除的功能

持久化: 系统重启,消息还在

临时: 系统重启,消息消失

自动删除: 当没有消费者时,消息就删除

RabbitMQ的安装——基于Docker

Docker-compose.yml

version: '3.1'

services:

rabbitmq:

restart: always

image: rabbitmq:management

container_name: rabbitmq

ports:

- 5672:5672

- 15672:15672

environment:

TZ: Asia/Shanghai

RABBITMQ_DEFAULT_USER: rabbit

RABBITMQ_DEFAULT_PASS: 123456

volumes:

- ./data:/var/lib/rabbitmq

关于RabbitMQ中的虚拟主机的概念

为了让多个项目组同时使用RabbitMQ服务器,可以在服务器中创建多个虚拟主机,每个项目组使用一个虚拟主机就可以解决冲突的问题。

208179a520635a1bf3ea99e9eaf7cc3b.png

RabbitMQ的初体验

  1. 引入依赖

<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.5.1</version>
</dependency>

  1. 编写消息的生产者

public class MyProducer {/* 消息的生产者: 1.连接RabbitMQ服务器 2.声明(创建)队列 3.往队列上发送消息 */ //声明队列名称private final static String QUEUE_NAME = "hello";public static void main(String[] args) throws Exception {//1.连接RabbitMQ服务器
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("192.168.2.156");//指明mq服务器的地址
connectionFactory.setPort(5672);
connectionFactory.setUsername("rabbit");//账号
connectionFactory.setPassword("123456");// connectionFactory.setHost("nz1905");//虚拟主机 //得到连接对象
Connection connection = connectionFactory.newConnection();//得到一个频道
Channel channel = connection.createChannel();//2.声明(创建)队列 /* 参数详解: 1)队列的名字 2)是否持久化, 如果是的话,即使服务器重启,队列还在 3)是否独占: 此队列只被一个消费者占有 4)是否自动删除: 如果没有消费者再去使用,那么队列就会删除 5)元数据参数 */
channel.queueDeclare(QUEUE_NAME,false,false,false,null);//3.发布消息 /* * @param exchange 指定的交换机 * @param routingKey the routing key 路由键/目前写的是队列名称 * @param props other properties for the message - routing headers etc 元数据参数 * @param body the message body 消息体 */
String message = "hello world";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());//简单队列模式来发消息
System.out.println("消息已发送");
}

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐