«

消息中间件实践-RabbitMQ介绍

问题引入

假设我们现在需要设计这样一个商户注册系统:注册完成后需要给用户发送激活邮件,开通商户信息,记录用户IP,时间等信息。初始的想法如下图所示: 但存在的问题是:用户注册响应会非常慢,多个系统强耦合

引入消息中间件

引入消息中间件,可以对多个系统解耦,设计图改进如下:

消息中间件介绍

一般认为,消息中间件是一种由消息传送机制或消息队列模式组成的中间件技术,主要用来进行平台无关的数据交流,进行分布式系统的集成。如下图所示:

应用场景

1.日志同步
2.分布式事务
3.数据复制
4.广播通知
5.业务系统解耦

开源消息中间件对比

RabbitMQ能为你做些什么

RabbitMQ是一个消息代理 。它可以为你的应用提供一个通用的
消息发送和接收平台(AMQP协议实现),并且保证消息再传输过程中的安全。

RabbitMQ技术亮点

可靠性 这些技术包括持久性、投递确认、发布者证实和高可用性。 灵活的路由 消息在到达队列前是通过交换器进行路由的。通过交换器,进行负载。 集群 在相同局域网中的多个RabbitMQ服务器可以被聚合在一起,作为一个独立的逻辑代理来使用。提供普通模式,镜像模式。 插件系统 RabbitMQ附带了各种各样的插件来对自己进行扩展。甚至你也可以写自己的插件来使用。

RabbitMQ交换机

RabbitMQ Demo

我们的大致的设计是这样的: 生产者(producer)把消息发送到一个名为“hello”的队列中。 消费者(consumer)从这个队列中获取消息。

一、引入jar包

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

二、生产者发送消息

1、创建和RabbitMQ的连接

ConnectionFactory factory = new ConnectionFactory();
factory.setHost("10.165.124.178");
factory.setUsername("hzfund");
factory.setPassword("aaa123");
factory.setVirtualHost("/");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

2.声明队列

channel.queueDeclare(QUEUE_NAME, false, false, false, null);

3.发送消息

channel.basicPublish("", QUEUE_NAME, null, message.getBytes());

4.关闭连接,通道

channel.close();
connection.close();

三、消费者获取数据

1、创建和RabbitMQ的连接,并且声明队列
2、需要为队列定义一个回调(callback)函数。当我们获取到消息的时候,
就会调用此回调函数

Consumer consumer = new DefaultConsumer(channel) {
    @Override public void handleDelivery(String consumerTag, Envelope envelope,
    AMQP.BasicProperties properties, byte[] body) throws IOException
    {
       String message = new String(body, "UTF-8");
       System.out.println(" [x] Received '" + message + "'");
    }
 };

3、 我们需要告诉RabbitMQ这个回调函数将会从名为"hello"的队列中接收消息

channel.basicConsume(QUEUE_NAME, true, consumer);

附录:Demo源码参考:https://github.com/bingoHuang/mq-demo

分享