zoukankan      html  css  js  c++  java
  • 20200202 ActiveMQ 8. ActiveMQ的传输协议

    ActiveMQ 8. ActiveMQ的传输协议

    8.1. 面试题

    1. 默认的61616端口如何更改
    2. 你生产上的连接协议如何配置的?使用tcp吗?

    8.2. 官网信息

    各种主要协议:

    ActiveMQ支持的client-broker通讯协议有:TCP、NIO、UDP、SSL、Http(s)、VM。

    其中配置Transport Connector的文件在ActiveMQ安装目录的conf/activemq.xml中的<transportConnectors>标签之内。

    <!--
        The transport connectors expose ActiveMQ over a given protocol to
        clients and other brokers. For more information, see:
    
        http://activemq.apache.org/configuring-transports.html
    -->
    <transportConnectors>
        <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
        <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    </transportConnectors>
    

    在上文给出的配置信息中,URI描述信息的头部都是采用协议名称:

    • 描述amqp协议的监听端口时,采用的URI描述格式为“amqp://······”;
    • 描述stomp协议的监听端口时,采用URI描述格式为“stomp://······”;
    • 唯独在进行openwire协议描述时,URI头却采用的“tcp://······”。这是因为ActiveMQ中默认的消息协议就是openwire

    8.3. 有哪些协议?

    8.3.1. Transmission Control Protocol(TCP)默认

    1. 这是默认的Broker配置,TCP的Client监听端口61616

    2. 在网络传输数据前,必须要先序列化数据,消息是通过一个叫wire protocol的来序列化成字节流。默认情况下ActiveMQ把wire protocol叫做OpenWire,它的目的是促使网络上的效率和数据快速交互;

    3. TCP连接的URI形式如:tcp://HostName:port?key=value&key=value,后面的参数是可选的。

    4. TCP传输的的优点:

      4.1. TCP协议传输可靠性高,稳定性强
      4.2. 高效率:字节流方式传递,效率很高
      4.3. 有效性、可用性:应用广泛,支持任何平台

    5. 关于Transport协议的可选配置参数可以参考官网

    8.3.2. New I/O API Protocol(NIO)

    1. NIO协议和TCP协议类似,但NIO更侧重于底层的访问操作。它允许开发人员对同一资源可有更多的client调用和服务器端有更多的负载。

    2. 适合使用NIO协议的场景:

      2.1. 可能有大量的Client去连接到Broker上,一般情况下,大量的Client去连接Broker是被操作系统的线程所限制的。因此,NIO的实现比TCP需要更少的线程去运行,所以建议使用NIO协议。
      2.2. 可能对于Broker有一个很迟钝的网络传输,NIO比TCP提供更好的性能。

    3. NIO连接的URI形式:nio://hostname:port?key=value&key=value

    4. 关于Transport协议的可选配置参数可以参考官网

    8.3.3. 其他协议

    8.3.3.1. AMQP协议

    Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同开发语言等条件限制。

    8.3.3.2. Stomp协议

    STOP,Streaming Text Orientation Message Protocol,是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息中间件)设计的简单文本协议。

    8.3.3.3. MQTT协议

    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当作传感器和致动器(比如通过Twitter让房屋联网)的通信协议。

    扩展:Github

    8.3.3.4. ws协议

    可以使用HTML5 WebSockets与MQ交互

    8.3.4. 总结

    协议 描述
    TCP 默认协议,性能相对可以
    NIO 基于TCP协议之上,进行了扩展和优化,具有更好的扩展性
    UDP 性能比TCP更好,但是不具有可靠性
    SSL 安全链接
    HTTP(s) 基于HTTP(s)
    VM VM本身不是协议,当客户端和代理在同一个Java虚拟机(VM)中运行时,它们之间需要通信,但不想占用网络通道,而是直接通信,可以使用该方式

    8.4. NIO案例演示

    1. 修改conf/activemq.xml,在<transportConnectors>标签中增加一行:
    <transportConnector name="nio" uri="nio://0.0.0.0:61618?trace=true" />
    

    如果不特别指定ActiveMQ的网络监听端口,那么这些端口都讲使用BIO网络IO模型。(OpenWire,STOMP,AMQP)

    所以为了首先提高单节点的网络吞吐性能,我们需要明确指定ActiveMQ网络IO模型。

    URI格式头以nio开头,表示这个端口使用以TCP协议为基础的NIO网络IO模型。

    1. 修改代码

      将生产者和消费者代码中的

      public static final String ACTIVEMQ_URL = "tcp://192.168.181.128:61616/";
      

      修改为

      public static final String ACTIVEMQ_URL = "nio://192.168.181.128:61618/";
      

    8.5. NIO案例演示加强

    问题:URI 格式以 nio 开头,表示这个端口使用 TCP 协议为基础的 NIO 网络 IO 模型。但这样的设置方式,只能使这个端口支持Openwire协议。如何让这个端口及支持NIO网络IO模型,又支持多个协议呢?

    使用 auto 的方式就相当于四合一协议 : STOMP AMQP MQTT TCP NIO

    auto 就像是一个网络协议的适配器,可以自动检测协议的类型,并作出匹配。使用+符号来为端口设置多种特性

    1. 修改conf/activemq.xml,在<transportConnectors>标签中增加一行:
    <transportConnector name="auto+nio" uri="auto+nio://0.0.0.0:61608?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600&amp;org.apache.activemq.transport.nio.SelectorManager.corelPoolSize=20&amp;org.apache.activemq.transport.nio.SelectorManager.maximumPoolSize=50" />
    
    1. 修改代码

      2.1. 将生产者和消费者代码中的ACTIVEMQ_URL改为如下,测试支持NIO;

      public static final String ACTIVEMQ_URL = "nio://192.168.181.128:61608/";
      

      2.2. 将生产者和消费者代码中的ACTIVEMQ_URL改为如下,测试支持TCP;

      public static final String ACTIVEMQ_URL = "tcp://192.168.181.128:61608/";
      

    对于 NIO 和 tcp 的代码相同,但不代表使用其他协议代码相同,因为底层配置不同,其他协议如果使用需要去修改代码

  • 相关阅读:
    Java NIO系列教程(十二) Java NIO与IO
    Java NIO系列教程(十一) Pipe
    Java NIO系列教程(十) Java NIO DatagramChannel
    Java NIO系列教程(九) ServerSocketChannel
    C#使用cmd运行命令并返回控制台输出信息
    分割nginx日志
    redis启动警告解决
    git worktree 目录修复
    git worktree 稀疏检出(sparseCheckout)
    python json dumps datetime类型报错
  • 原文地址:https://www.cnblogs.com/huangwenjie/p/12251046.html
Copyright © 2011-2022 走看看