• RabbitMQ简介(一)


    1.什么是消息中间件

    消息(Message)是指在应用中传递的数据,可以是字符串或json数据

    消息中间件是指利用高效可靠的消息传递机制,一般有两种传递模式:点对点模式和发布订  阅模式

    点对点模式(p2p,point to point)是基于队列的,消息生产者发送消息到队列,消息消费者从队列接受消息,队列的存在使消息的异步传输成为了可能。

    发布订阅模式定义了如何向一个内存节点发布订阅消息,这个内容节点称为主题(topic),主题相当于中介,消息发布者发布到一个主题,消息订阅者在一个主题订阅,发布者和订阅者不用接触便能保证消息的传递,发布和订阅在消息的一对多广播时采用。

    2.消息中间件的作用

    解耦:消息中间件提供了对应的api,消息生产者和消费者依赖对应的api,可以不用互相调用对方实现消息的传递

    沉余(存储):处理数据的过程可能会失败,消息中间件可以把数据持久化直到他们完全被处理,保证数据的安全性

    拓展性:消息中间件解耦了消息的处理过程,提高队列的入队和处理的效率时很容易的,只要增加其处理过程

    削峰:在访问量剧增下,消息中间件关键组件能支撑访问压力,不会因超负荷请求而崩溃

    可恢复性:一部分组件失效后,不会影响整个系统,一个处理消息的进程挂掉,加入中间件的消息仍能在系统恢复之后进行处理

    顺序保证:可以保证数据顺序处理

    缓冲:消息中间件通过缓冲层来帮助任务更高效率的执行,有助于优化和控制数据流经过系统的速度

    异步通信:可以将不需要及时处理的消息放入消息队列,之后慢慢处理

    3.消息中间件的使用

    添加一个队列

    生产者示例代码

    1. public class RabbitProducer {
    2. public static final String EXCHANGE_NAME = "exchange_name";
    3. public static final String ROUTING_KEY = "toutingkey_demo";
    4. public static final String QUEUE_NAME = "queue_demo";
    5. public static final String IP_ADDRESS = "127.0.0.1";
    6. /**
    7. * rabbitmq默认端口
    8. */
    9. public static final int PORT = 5672;
    10. public static void main(String[] args) throws Exception {
    11. ConnectionFactory factory = new ConnectionFactory();
    12. factory.setHost(IP_ADDRESS);
    13. factory.setPort(PORT);
    14. factory.setUsername("guest");
    15. factory.setPassword("guest");
    16. //创建连接
    17. Connection connection = factory.newConnection();
    18. //创建信道
    19. Channel channel = connection.createChannel();
    20. //创建一个type="direct",持久化的,非自动删除的交换器
    21. channel.exchangeDeclare(EXCHANGE_NAME, "direct", true, false, null);
    22. //创建一个持久化,非排他的,非自动删除的队列
    23. channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
    24. //发送一条持久化的消息:Hello World!
    25. String message = "Hello World!";
    26. channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY,
    27. MessageProperties.PERSISTENT_TEXT_PLAIN,
    28. message.getBytes());
    29. channel.close();
    30. connection.close();
    31. }
    32. }

     消费者示例代码

    1. public class RabbitConsumer {
    2. public static final String QUEUE_NAME = "queue_demo";
    3. public static final String IP_ADDRESS = "127.0.0.1";
    4. /**
    5. * rabbitmq默认端口
    6. */
    7. public static final int PORT = 5672;
    8. public static void main(String[] args) throws Exception {
    9. Address[] addresses = new Address[]{
    10. new Address(IP_ADDRESS, PORT)
    11. };
    12. ConnectionFactory factory = new ConnectionFactory();
    13. factory.setUsername("guest");
    14. factory.setPassword("guest");
    15. //创建连接
    16. Connection connection = factory.newConnection(addresses);
    17. //创建信道
    18. Channel channel = connection.createChannel();
    19. //设置客户端最多接受未被ack的消息的个数
    20. channel.basicQos(64);
    21. Consumer consumer = new DefaultConsumer(channel){
    22. @Override
    23. public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
    24. System.out.println("recv message:" + new String(body));
    25. try {
    26. TimeUnit.SECONDS.sleep(1);
    27. } catch (InterruptedException e) {
    28. e.printStackTrace();
    29. }
    30. channel.basicAck(envelope.getDeliveryTag(), false);
    31. }
    32. };
    33. channel.basicConsume(QUEUE_NAME, consumer);
    34. //等待回调行数执行完毕之后,关闭资源
    35. TimeUnit.SECONDS.sleep(5);
    36. channel.close();
    37. connection.close();
    38. }
    39. }

    出自RabbitMQ实战指南

  • 相关阅读:
    【德哥说库系列】-PostgreSQL跨版本升级
    Vector-valued function
    面试系列分布式事务:谈谈3PC的理解
    积分商城游戏能够给商家带来什么?怎么搭建积分商城?
    不要小看一个Redis,从头到尾全是精华,阿里Redis速成笔记太香了
    vivo 网络端口安全建设技术实践
    第68步 时间序列建模实战:ARIMA建模(Matlab)
    硬件开发笔记(六): 硬件开发基本流程,制作一个USB转RS232的模块(五):创建USB封装库并关联原理图元器件
    CentOS 7.3 Linux系统安装过程介绍
    Mac和VScode配置fortran
  • 原文地址:https://blog.csdn.net/qq_39482039/article/details/126468858