• 【java、微服务】MQ


    MQ(MessageQueue),中文是消息队列,字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。

    同步通讯

    优点

    时效性较强,可以立即得到结果

    问题

    微服务间基于Feign的调用就属于同步方式,存在一些问题。

    1. 耦合度高。每次加入新的需求,都要修改原来的代码
    2. 资源浪费。调用链中的每个服务在等待响应过程中,不能释放请求占用的资源,高并发场景下会极度浪费系统资源。
    3. 级联失败。调用者需要等待服务提供者响应,如果调用链过长则响应时间等于每次调用的时间之和
    4. 性能下降。如果服务提供者出现问题所有调用方都会跟着出问题,如同多米诺骨牌一样,迅速导致整个微服务群故障

    异步通讯

    异步调用常见实现就是事件驱动模式

    优点:

    1. 耦合度低
    2. 吞吐量提升
    3. 故障隔
    4. 流量削峰

    缺点:

    1. 依赖于Broker的可靠性、安全性、吞吐能力
    2. 架构复杂了,业务没有明显的流程线,不好追踪管理

    rabbitMQ

    下载

    docker pull rabbitmq:3-management

    运行

    docker run -e RABBITMQ_DEFAULT_USER=hzy -e RABBITMQ_DEFAULT_PASS=123456 --name mq --hostname mq1 -p 15672:15672 -p 5672:5672 -d rabbitmq:3-management
    

    控制台 

    运行原理和结构 

    channel: 操作MQ的工具

    exchange:路由消息到队列中

    queue:缓存消息

    virtual host:虚拟主机,是对queue、exchange等资源的逻辑分组,用来隔离和管理多租户环境 

    消息模型

    基本消息队列(BasicQueue)

    创建连接

    1. ConnectionFactory factory = new ConnectionFactory();
    2. // 设置连接参数
    3. factory.setHost("127.0.0.1");
    4. factory.setPort(5672);
    5. factory.setVirtualHost("/");
    6. factory.setUsername("admin");
    7. factory.setPassword("admin");
    8. Connection connection=factory.newConnection();
    9. Channel channel=connection.createChannel();
    10. String queueName="test001";
    11. channel.queueDeclare(queueName,false,false,false,null);

    生产者

    1. // 发送信息
    2. String message="hello,rabbitmq";
    3. channel.basicPublish("", queueName, null, message.getBytes());
    4. System.out.println("send message is:"+message);
    5. // 关闭资源
    6. channel.close();
    7. connection.close();

    消费者

    1. channel.basicConsume(queueName,true,new DefaultConsumer(channel){
    2. @Override
    3. public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException{
    4. String message=new String(body,"UTF-8");
    5. System.out.println("收到消息:"+message);
    6. }
    7. });

    工作消息队列(WorkQueue)

    发布订阅(Publish、Subscribe),又根据交换机类型不同分为三种:

    是基于最基础的消息队列模型来实现的,只包括三个角色:

    publisher:消息发布者,将消息发送到队列queue

    queue:消息队列,负责接受并缓存消息

    consumer:订阅队列,处理队列中的消息

    Fanout Exchange:广播,Publish/Subscribe

    Direct Exchange:路由,Routing

    Topic Exchange:主题,Topics

    Kafka

    ActiveMQ

    RocketMQ

  • 相关阅读:
    Qt设置整体背景颜色
    谣言检测()《Data Fusion Oriented Graph Convolution Network Model for Rumor Detection》
    JavaScript Reference Type 解读
    好分期 Prober 自动化性能监控技术实践
    使用Redisson配置redis
    mongdb迁移方案及比对方案
    OSPF协议:优点、初始化流程和管理
    【译】在 Visual Studio 中处理图像变得更容易了
    【Java基础】Java全栈体系(一)
    【新日语2】单元复习(一)
  • 原文地址:https://blog.csdn.net/David_Hzy/article/details/134233803