(7)Artemis传输配置

1.接收器(Acceptor

    在Artemis传输中接收器是一个重要的概念,如下broker.xml中接收器的配置:

<acceptor name="netty">tcp://localhost:61617</acceptor>

 

     可以在acceptor元素中定义一个或多个接收器。每台服务器接收器的数量没有上限。每个接收器定义了一种可以与Artemis服务器建立连接的方式。

    URL模式部分定义了Acceptor类型,如tcp或vm,分别对应在Netty Acceptor和VM Acceptor。可以通过键值对方式配置一组特殊的传输属性,如下:

<acceptor name="netty">tcp://localhost:61617?sslEnabled=true&keyStorePath=/path</acceptor>

2.连接器(connector

    虽然在服务器使用接收器来定义如何接受连接的方式,但连接器定义如何连接到服务器。

<connector name="netty">tcp://localhost:61617</connector>

 

    可以在connector元素中定义连接器,可以定义一个或者多个连接器,每台服务器的连接数没有上限。

    连接器用于当服务器作为客户端连接其他服务器。例如:当一台服务器桥接到另一台服务器;或者当一台服务器作为集群的一部分时。在这些情况下,服务器知道如何连接到其他服务器,这是由连接器定义的。

3.单端口支持

    Artemis支持所有协议使用同一个端口,Artemis将自动检测正在使用的协议CORE、AMQP、STOMP等,并且使用相应的Artemis处理程序。同时还会检测是否正在使用例如HTTP或者websocket等协议,使用适当的解码器进行处理。通过acceptor配置限定使用的消息协议:

<acceptor name="netty">tcp://localhost:61617?protocols=CORE,AMQP</acceptor>

4.配置ArtemisNetty TCP

    Netty TCP是使用简单的未加密的基于TCP套接字的传输,如果在不受信的网络上运行可以使用SSL或HTTPS。

    所有用于Netty TCP方案的有效属性key都在org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants类中定义。大多数参数都可以用于接收端和连接点,有些配置只能用于连接端。如下这些Netty配置可以通过在broker配置的连接器或接收器中的URL属性中进行定义。

 <acceptor name="artemis">tcp://10.0.0.1:61617?remotingThreads=200;directDeliver=false;tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=CORE,AMQP,STOMP,MQTT,OPENWIRE;useEpoll=true</acceptor>

    简单的Netty TCP配置如下:

  • host

    指定连接的主机名或者ip地址(配置连接器),或者监听地址(配置接收器)。在接收器中可以通过用逗号分隔多个主机或ip来指定监听地址,也可以指定0.0.0.0来接收服务器所有网络接口的连接。但是为连接器指定多个地址是无效的,连接器只与一个特定地址建立连接。默认值为localhost(只限本地)。

  • port

    用于指定连接端口(连接器)或监听的端口(监听器),默认为61616。

  • tcpNoDelay

    如果为true将禁用Nagle算法,这是一个java客户端套接字选项。默认为true。

    (Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块,要求TCP连接上最多只能有一个未被确认的小分组,在该分组的确认到达之前不能发送其他的小分组)。

  • tcpSendBufferSize

    此字段定义TCP发送缓存大小(单位bytes),默认值为32768bytes(32KiB)。应根据网络带宽和延迟来调整TCP缓冲区大小。TCP发送/接收缓冲区大小计算公式如下:

    buffer_size = bandwidth * RTT

    bandwidth(网络带宽)以每秒字节数为单位,RTT(网络往返时间)以秒为单位,使用ping可以轻松测量RTT。对于快速的网络,可以增加缓冲区大小设置。

  • tcpReceiveBufferSize

    此字段定义TCP接收缓存大小,默认值为32768bytes(32KiB)。

  • writeBufferLowWaterMark

    此参数确定Netty写缓存的低位阀值,一旦在写缓存区中排队的字节数超过高位阀值(writeBufferHighWaterMark定义的值)后,只有待写入缓存队列大小降到该值以下时,Netty通道才会再次开始写入。默认值为32768bytes(32KiB)

  • writeBufferHighWaterMark

    此参数定义Netty写缓存的高位阀值,如果写缓存区中排队的字节数超过此值,则Netty通道将不可写入,默认值为131072字节(128KiB)。

  • batchDelay

    在将数据包写入传输通道之前,此配置可以设置最多一次性批量写入此配置的ms数。这个配置可以增加大量小消息的吞吐量,这样做的代价是增加数据传输的平均时延。默认值为0ms。

  • directDeliver

    当消息到达服务器并传递给等待的消费者时,默认情况下,消息到达和传递消息是在同一个线程中进行处理的。这在具有相对较小的消息和少量消费者的环境中提供了较好的延迟,但是牺牲总体吞吐量和可伸缩性为代价的-特别是在多核机器上。如果愿意提升些延迟,但是希望吞吐量高可以将此值设置为false。默认为true。

  • remotingThreads

    默认情况下Artemis使用三倍的CPU内核(或超线程)数量(Runtime.getRuntime().availableProcessors() 获取的值)的三倍线程来处理输入的包数据。默认值为-1也就是Runtime.getRuntime().availableProcessors() *3的值。

  • localAddress

    配置Netty连接器时,知道客户端在连接到远程地址时将使用的本地地址。通常程序服务器上使用,或者用于运行嵌入式时控制哪个地址用于外部连接。如果未设置,则连接器将使用任何可用的本地地址。

  • localPort

    在配置Netty连接器时,指定客户端在连接到远程地址时将使用的本地端口。如果使用默认值(0)则连接器将让系统获取临时端口,有效端口为0~65535。

  • connectionAllowed

    此配置仅适用于接收器,限制了接收器允许的连接数,达到此限制时,将向日志发出DEBUG级别消息,并拒绝连接。正在使用的客户端类型将决定拒绝连接是会发生什么,在core客户端会导致org.apache.activemq.artemis.api.core.ActiveMQConnectionTimedOutException。

  • handshake-timeout

    为了防止未经授权的客户端打开打来连接并且保持打开状态由于每个连接都需要占用文件句柄,因此会消耗句柄导致其他客户端无法使用资源。设置此值为连接握手超时时间,默认值为10s,其值为0或负整数,此功能关闭。更改此值需要重启服务器才能生效。

5.配置Netty本地传输类型

    当使用系统平台支持Netty Native Transport,允许Artemis使用本地sockets/io而不是java nio。与基于Java NIO的传输相比,可以产生更少的垃圾,并且通常可以提高性能。客户端和服务器都能从中受益,当前支持的平台:

  •     Linux运行64位JVM
  •     MacOS运行64位JVM

    当检测到支持的平台,Artemis将默认启用相应的本地传输。如果不支持或者加载本机库有问题,自动回退到Java NIO。

5.1 Linux本地传输

    在支持本地传输的Linux平台使用Epoll(一种I/O多路复用模型).

    如下配置特定用于Linux

    useEpoll:默认情况检查到执行Linux系统的64位JVM,将使用epoll,如果此设置为false将强制使用Java NIO,默认为true。

5.2 MacOS本地传输

    在MacOS平台中使用KQueue。

    如下配置特定于MacOS:

    useKQueue:如果检测到运行在MacOS系统的64位JVM,将使用KQueue,如果此设置为false将强制使用Java NIO,默认为true。

6.配置Netty SSL

    Netty SSL类似于Netty TCP传输,其通过使用安全套接字层(Secure Sockets Layer SSL)加密TCP连接来获取额外的安全。

    Netty SSL包含了Netty TCP的所有属性配置,此外还有如下其他专用的配置:

  • sslEnabled

    是否开启SSL,默认为false。

  • keyStorePath

    当用于acceptor中定义SSL key存储的路径。它存放了服务器的证书(无论是自签名还是机构签名)。

    当在连接器上使用时,它定义了客户端的SSL key存储路径,其存储了客户端的证书。如果使用双向SSL(即互相身份认证),虽然在服务器上配置了此值,但客户端会下载并使用。如果客户端和服务器要使用不同的路径。可以在使用"javax.net.ssl.keyStore"系统属性或特定于ActiveMQ的"org.apache.activemq.ssl.keyStore"来覆盖服务器端设置。

  • keyStorePassword

    当用于acceptor时,定义了服务端秘钥库密码。

    当用于连接器上时,定义了客户端秘钥库密码。如果使用双向SSL(即互相身份认证),虽然在服务器上配置了此值,但客户端会下载并使用。如果客户端和服务器要使用不同的密码。可以在使用"javax.net.ssl.keyStorePassword"系统属性或特定于ActiveMQ的"org.apache.activemq.ssl.keyStorePassword"来覆盖服务器端设置。

  • trustStorePath

    当用于接收器时,用于存储服务器信任的所有客户端的私钥。当使用双向认证时,此配置仅适用于接收器。

    在连接器上使用时,该路径用于存储客户端信任的所有服务器公钥。虽然在服务器上配置了此值,但客户端会下载并使用。如果客户端和服务器要使用不同的路径。可以在使用"javax.net.ssl.trustStore"系统属性或特定于ActiveMQ的"org.apache.activemq.ssl.trustStore"来覆盖服务器端设置。

  • trustStorePassword

    当用于接收器时,此配置为服务端信任库的密码。当使用双向认证时,此配置仅适用于接收器。

    在连接器上使用时,这是客户端信任库的密码。虽然在服务器上配置了此值,但客户端会下载并使用。如果客户端和服务器要使用不同的密码。可以在使用"javax.net.ssl.trustStorePassword"系统属性或特定于ActiveMQ的"org.apache.activemq.ssl.trustStorePassword"来覆盖服务器端设置。

  • enabledCipherSuites

    无论是在连接器还是在接收器上使用,这都是用于SSL通讯的以逗号分隔的密文族。默认为null,意味着使用JVM默认值。

  • enabledProtocols

    无论是在连接器还是在接收器上使用,这都是用于SSL通讯的以逗号分隔的协议列表。默认为null,意味着使用JVM默认值。

  • needClientAuth

    仅用于接收器,定义连接此接收器的客户端需要双向SSL,默认值为false。此属性优先于wantClientAuth,如果其值为true,忽略wantClientAuth。

  • wantClientAuth

     仅用于接收器,定义连接到此接收器的客户端需要双向SSL但不是必须的。默认值为false。

  • verifyHost

     在接收器上使用时,客户端的CN SSL证书将与其主机名进行比较以验证他们是否匹配。仅用于书双向SSL。

    在连接器上使用时,服务器的CN SSL证书将与其主机名进行比较以验证他们是否匹配。单向和双向都可以。

    默认值为false。

  • trustAll

    在连接器上使用时,客户端将信任隐式信任所提供的服务器证书。无论是否配置了任何信任库。警告:此设置主要仅用于测试,不在生产中使用。默认值为false。

  • useDefaultSslContext

    仅在连接器上有效,允许连接器使用默认的SSL上下文(通过SSLContext.getDefault()获取),可以由客户端以变成的方式设置(通过SSLContext.setDefault(SSLContext)设置)。如果为true,则忽略除sslEnabled外的所有其他SSL相关参数。默认为false。

  • sslProvider

    用于更改JDK和OPENSSL直接的提供者。默认为JDK。如果使用OPENSSL,可以在类路径中添加netty-tcnative以使用本地安装的openssl。如果想使用特殊的ciphersuite - elliptic组合,这组合是通过openssl而不是JDK提供的。

7.配置Netty HTTP

    Netty HTTP包含了Netty TCP的所有属性配置,此外还有如下其他专用的配置:

  • httpEnabled

    现在不再需要这个了。 通过单端口支持,Artemis现在将自动检测是否正在使用http并自行配置。

  • httpClientIdleTime

    设定客户端空闲连接存活时间。

  • httpClientIdleScanPeriod

    扫描空闲客户端的频率(以毫秒为单位)。

  • httpResponseTime

    服务器在发送空的http响应以保持连接活动之前可以等待多长时间

  • httpServerScanPeriod

    扫描需要响应的客户端的频率(以毫秒为单位)。

  • httpRequiresSessionId

    如果为true客户端将在第一次调用后等待以接收会话ID。使用http连接器连接到servlet接收器(不推荐)。

 

注:此系列文章为Apache Artemis V2.6.2官方使用文档的简要翻译文档(非完全按照官方文档排版进行翻译,有删减),个人能力有限如有错误请谅解。源文档地址:http://activemq.apache.org/artemis/docs/latest/index.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值