ActiveMQ分布式网络(Forward Bridge)

    当ActiveMQ面对大量消息存储和大量Client交互时,性能消耗将会达到单个broker极限,此时我们需要对ActiveMQ进行水平扩展。ActiveMQ提供了“network”机制,可以把多个broker实例“串联”一起,形成“Forward Bridge”模型(转发桥)。这些Broker通过有向网络(networkerConnector)链接在一起,组成broker集群,任何一个Borker都可以与Client数据交互,消息也将在Broker网络中“流动”直到被消费,之所以“流动”,因为“producer”和“consumer”会与不同的broker建立链接,我们认为“转发桥”架构模式是“较大”集群数据的解决方案。

 

    在master-slave模式中,消息将会在多个broker上备份,即集群中每个broker上消息都一样,在故障转移时不会发生消息丢失的问题(持久化消息)。“Forward Bridge”意味着消息可以在broker间“转发”直到消息被消费,在任意时刻一条消息只会被一个broker持有;Producer发送的消息,可能会经过多个Broker转发最终才会到达Consumer,如果其中某个Broker失效,那么其上的消息将不可用(当然也可以为每个节点采用M-S架构,以提高可用性),直到它再次加入集群,因此“Forward Brige”模式并不是ActiveMQ HA(高可用)方案,但是因为集群中每个Broker都可以独立为Client服务而且消息可以动态的在网络中迁移,所以“Forward Bridge”是解决海量消息的必备策略。




 
 

 

    当network中某个Broker故障失效,failover协议可以让Client迁移到其他正常的Broker上,从整体来看,并不会影响Client的数据交互。ActiveMQ还提供了动态平衡的机制,当某个Broker加入集群,可以让其他Broker上部分Client迁移到新的Broker上,从全局实现“负载均衡”。

 

    对于Queue而言,消息只会转发给有消费者存在的broker上,比如有三个Broker A,B,C,它们之间使用双向网络链接,如果A,B上有Consumer,C上没有,那么消息只会在A和B之间转发,C上将不会有任何消息。

 

    对于Topic而言,每个Broker都可能获取消息,即使broker上没有消费者;消息转发有配置决定,比如包含在staticallyIncludeDestinations中的Topic、在dynamicOnly为false情况下包含在durableDestinations中的Topic,这些Topic中的消息总是被转发给remote Broker。

 

    1)多个brokers通过网络连接组成分布式网络,消息可以在多个brokers之间流动,每个broker都可以存储消息,从而降低单个broker的存取压力,在存储层面类似于“sharding”。

    2)broker的离群只会导致此节点上的数据失效,不会影响集群的其他节点。

    3)Failover协议支持:broker失效后,其上的client将会迁移到其他broker上;当broker加入集群,其他brokers上的部分clients将有迁移到此broker上;最终在Client层面,实现存取的“负载均衡”。

    4)不需要太多的人工干预。

    5)producer和consumer可以与不同的broker建立连接,但是消息的消费不会受到影响;可以支撑较大规模的客户端个数,而且客户端的个数可以在多个brokers负载均衡。

 

    首先需要注意,分布式网络中的所有broker都不能有相同的brokerName和brokerId,且强烈建议开启“advisorySupport=true”。

 

<broker brokerName="broker-0" dataDirectory="${activemq.data}">

	<networkConnectors>
	  <networkConnector name="broker0-broker1" duplex="true" networkTTL="1" uri="static:(tcp://localhost:51616)"/>
	</networkConnectors>

	<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"/>
	</transportConnectors>

</broker>

 

    网络发现:

    networkConnector中使用uri属性来指定远端的Broker地址(下游网络节点,可以有多个),我们可以使用“static:(broker1,broker2)”格式指定候选broker列表,“static”是一个逻辑协议,和Client端使用的“failover”协议一样,可以实现链接重连和列表遍历重试特性。通常“static”协议用在networkConnector中,“failover”协议用在Client端。broker将会依次尝试与uri中每个broker建立链接,直到与其一建立成功为止。通常uri中broker列表为master-slave模式,这也是broker高可用设计要求,我们可以使用masterslave协议:

<networkConnectors>
  <networkConnector uri="masterslave:(tcp://master:61616,tcp://slave:61616)"/>
</networkConnectors>

 

    在production环境中,我们通常不能使用“network动态发现”,所以在此不在赘言。

    当networkerConnector与remote Broker建立链接之后,那么remote Broker将会向local Broker交付订阅信息,包括remote broker持有的destinations、Consumers、持久订阅者列表等;那么此后local Broker将把remote Broker做一个消息“订阅者”,local Broker接收到的所有消息都会有条件(根据remote Broker订阅情况,以及本地的destination配置)的转发给remote Broker。如果集群中有新的Consumer、Destination创建,都会通过“Advisory Topic”发送通知,这些通知消息,和普通的消息一样也会在集群网络中转发,那么所有的broker都可以通过“Advisory”通知来获取集群动态,并调整消息转发。

 

    networkConnector核心属性:

    1. name:每个networkConnector都需要一个名称,而且在本地的networkConnectors列表中不能重复。

    2. dynamicOnly:用来表明connector是否只支持动态激活“durable订阅者”,默认为false,表示networkConnector在创建成功后,将立即激活所有的“durable Topic”,即使本地没有Topic的消费者(如果本地Broker已经有消费者,肯定会激活),本地Broker也会创建一个“典型的”订阅者,并将订阅信息发送给remote Broker,此后remote Broker接收到的Topic消息也将转发给本地Broker。如果为true,那么netwokrConnector将不会立即激活它们(本地没有消费者的durable Topic),直到从“Advisory”通知获取到激活消息(有Durable Consumer创建)时,才会做上述操作。它将对Durable Topic中消息在网络中转发的时机有重要影响。通常设定为false,以避免broker大面积失效时,Client迁移到那些尚没有接收到任何“Advisory”的新Broker节点上;不过如果网络比较稳定,设定dymanicOnly为true,可以有效的提升Topic消息的转发效率。

 

    比如A,B两个Broker,它们之间使用了“duplex”双向网络链接,并设置“dynamicOnly = true”;我们首先启动A并在其上创建一个durable订阅者,并由producer创建几个消息;然后启动B,producer继续在A上创建消息,此时我们会发现B上其实没有接受到任何消息(因为B没有接收到任何Advisory);此后我们重新在A上创建durable订阅者,这时我们会发现B上尽管没有任何消费者信息,但其也接收到了Topic消息的Copy。(如果此值为false,那么当B启动后,即使其上没有消费者,A仍然需要将durableDestinations中的Topic的消息转发给B)

<networkConnectors>
  <networkConnector name="broker0-broker1" duplex="true" dynamicOnly="true" networkTTL="1" uri="static:(tcp://localhost:51616)">
	<!-- dynamicOnly只对durableDestinations有效 -->
	<durableDestinations>
		<topic physicalName="order.dbcenter"/>
	</durableDestinations>
 </networkConnector>

 

    3. decreaseNetworkConsumerPriority:是否降低网络消费者(Queue)的权重,默认为false,即remote Broker中的Consumers与本地Consumer具有相同的权重(默认值=0,我们可以为每个消费者指定权重),消费者“权重”决定了它获取消息的优先级,较高权重的消费者将优先消费消息。如果此值为true,那么remote Broker中的Consumer将具有最低的优先级(-7),那么只有当Queue在Local Broker中没有Consumer,或者所有的Consumers都满负荷(prefetch Buffe已满)时,才会将消息转发给remote Broker中的Consumer。这是一种较好的调优策略,不仅可以降低消息转发的开支,而且还能较好的确保消息顺序,通常我们设置为true,唯一的缺点就是不利于Queue consumers在全局范围内负载均衡。 (解决的问题:首先保证消息被当前broker上的consumer消费,只有当本地所有的消费者都繁忙时才转发给remote broker上的consumer。)

 

    4. networkTTL:消息在网络中转发的最大生命周期,默认为1,即消息只会在网络中转发一次。消息在网络中每转发一次,都会将TTL-1,并且将当前的brokerId添加到路由信息中,当TTL=0或者当前brokerId已经在路由表中(此broker已经转发过此消息,避免loop),那么消息将不会继续转发下去。通常此值小与broker节点的个数,如果集群中brokers有回环网络,则建议为1,比如:A->B,B->C,C->A。(避免networkConnector是链状,且有回环情况,良好的架构下,应该是星状结构,即每个broker都与其他brokers建立连接,而不是链状结构--pipleline)

 

    5. conduitSubscriptions: 是否将remote Broker下同一个Destination中的多个Consumer,作为一个Consumer对待。默认为true。(conduit:管线)

 

    6. duplex:网络是否为双向的,默认为false。如果为true,则remote Broker不仅是“订阅者”,还可以作为消息的“生产者”,即remote Broker也会向Local Broker转发消息。我们通常是,每个broker均与其他broker建立单向的networkConnector,比如有三个broker A/B/C,那么在A上配置2个单向的:A->B,A->C,那么在B上配置:B->A,B->C,以此论推。

 

    7. alwaysSyncSend: 向remote Broker转发消息时,是否总是同步发送。默认为false,即只对持久化消息采用同步发送;如果为true,那么对于非持久化消息也将采用同步发送。所谓同步发送,就是local Broker通过networkerConnector将消息发送给remote Broker后,阻塞并等到remote Broker返回ACK指令。这是消息存储担保的方式。

 

    8. staticBridge:是否为“静态”Bridge,默认false,即networkConnector可以通过Advisory通知来获取Consumer的变更,并调整转发策略。如果为true,那么broker将不关注任何Advisory(Consumer变更),只会使用“staticallyIncludeDestination”配置创建必要的订阅。

 

    9. brigeTempDestinations:当Temp通道创建时,是否发送Advisory通知,并支持其消息的转发,默认为true。在Queue中,在使用request-reply(请求--应答)模式的消息消费时,reply通道通常是一个temp destination(与Connection同生命周期,其他Connection可见,不可跨Broker,其他特性和正常的Destination一样),这种destination在分布式网络中会有些局限性,有可能Producer和Consumer分布在不同的broker上, 如果禁用此属性,那么Consumer的reply消息将无法到达Producer(temp 通道无法跨越多个broker或者Connection,Consumer将会因为找不到Temp Destination而发生异常)。建议此值为true,分布式网络将通过Advisory来感知temp通道的创建(producer端创建),并在Consumer端消息转发时支持Temp通道中的消息(判定当前Broker是否已经接收到了Advisory,如果接收到此通知,那么broker将会在本地保留temp destination信息)。参见源码【AdvisoryBroker】

 

    可靠性:

    网络中的Broker总是首先保存消息,然后转发;消息的可靠性依赖于消息本身是否为持久化类型或者订阅者是否为duarable,非持久化消息和临时订阅者的消息仍然在broker失效时有丢失的风险;消息的属性不会在转发时修改。

 

    消息顺序(Queue):

    即使单个Broker,也无法保证消费者获取消息的顺序是严格一致的,除非只有一个Consumer(其实即使只有一个Consumer,如果发生消息重发的情况,顺序性会打破);那么对于分布式网络中的Broker,这种顺序性就更加难以保证,因为remote Broker相对于Local Broker,它就是一个逻辑上的Consumer,Local Broker从Queue的头部移除消息,转发给Remote Broker,那么remote Broker接受到消息之后,将消息添加到本地Queue的尾部,很明显,这个转发过程已经打破了Queue中消息的有序性(双端都有一个本地Queue),如果有多个Producer且分布在多个Broker上,而且还指定了Consumer Proirity,那么情况可能就更加复杂。

 

    Conduit Subscriptions:

    上述已经提到networkConnector中有个属性为“conduitSubscriptions”,当networkConnector创建成功后,local Broker已经知道remote Broker所持有的consumer列表(包括此后在remote broker上新加入的Consumer),当Local Broker接收到新消息时,也会将有关的消息转发给remote Broker。对于Topic订阅而言,如果remote Broker上有多个订阅者时,local broker将会把消息转发给每个订阅者,事实上同一条消息多次转发给了remote Broker,remote Broker接收到消息之后将会重新整理,并发送到本地订阅者时,就会出现重复消息的问题。所以在Topic中,我们通常设定“conduitSubscriptions=true”,同时为了避免重复消息的检测对Client造成影响,我们还需要在每个broker上的Topic策略上添加“enableAudit=false”。

<policyEntry topic=">" enableAudit="false">
....

 

    对于Queue而言,“conduitSubscriptions”却有不同的解释,如果此值为true,那么remote Broker上有多个consumer时也将按照看做一个consumer,这对消息的全局负载均衡是不利的。比如A,B两个Broker,如果A上有一个Consumer,B上有2个Consumers,如果Queue中有30条消息且Consumer的权重都一样的情况下,在conduitSubscriptions=true时,那么对于A而言它只认为B上有一个Consnumer,所以A和B各得到15条消息;如果conduitSubscriptions为false,那么对于A而言它认为B上有2个Consumer,即全局有3个Consumers,那么将会转发给B共20条消息, 那么三个消费者均会获得10条消息。(源码参见:DurableConduitBridge,DemandForwardingBridge)

 

    不过对于Queue而言,还有一个非常麻烦的事情,就是“selector”问题,网络Broker在转发消息时不会关注selector,即有可能不符合remote Broker中consumer selector的消息也会转发,此时这些消息无法被remote consumer所消费,而且也不会再次回传;如果remote consumer中使用了selector,暂时的策略就是让conduitSubscriptions=false;事实上,ActiveMQ是不希望消息不断回传,而是希望使用“reblanceClient”。

 

 

    通常,我们对Topic和Queue采用单独配置的原则:

<networkConnector name="broker0-broker1-topic" uri="static:(tcp://broker1:61616)" conduitSubscriptions="true">
	<excludedDestinations>
		<queue physicalName=">"/>
	</excludedDestinations>
</networkConnector>

<networkConnector name="broker0-broker1-queue" uri="static:(tcp://broker1:61616)" conduitSubscriptions="false">
	<excludedDestinations>
		<topic physicalName=">"/>
	</excludedDestinations>
</networkConnector>

 

    duplex网络:

    默认Duplex为false,即单向网络,此时remote Broker作为订阅者,Local Broker负责向remote Broker转发消息;如果duplex为true,那么Local Broker也作为订阅者,此时remote Broker也可以通过链接转发消息,相当于在A上配置了A->B和在B上配置了B->A效果是一样的,只使用了不过2个单向的网络链接;如果2个broker之间数据传输量较大或者开发者希望个性化配置时,我们可以配置2个单向网络。

    此外需要提醒,不要在2个broker之间重复配置duplex=true的网络链接。

<!-- broker0-broker1 -->
<networkConnector name="broker0-broker1" uri="static:(tcp://broker1:61616)" duplex="false" />

<!-- broker1-broker0 -->
<networkConnector name="broker1-broker0" uri="static:(tcp://broker0:61616)" duplex="false" />

 

    Advisory:

    ActiveMQ提供了“Advisory”机制,通常ActiveMQ内部将某些事件作为“advisory”在全局广播,比如destination的创建、consumer的加入、DLQ的产生等,这将额外的消耗极小的性能;我们可以在ActiveMQ的监控页面上看到影响的消息,开发者也可以View这些消息(通道名称以“ActiveMQ.Advisory.”开头)。对于分布式网络中的broker,将严重依赖“Advisory”,特别是“dynamic network”,我们建议无论如何都要开启它。(在一个broker上发生事件,都会以“通知”的方式发送给配置文件中指定的所有networkConnector)

<!-- 默认为true -->
<broker advisorySupport="true" ...>

 

    Dynamic networks:

    “动态网络”表明当remote Broker持有通道的消费者时,local Broker才会转发相应的消息;此时我们需要开启advisorySupport。当remote broker上有Consumer创建时,Advisory中将会广播消息,消息为ConsumerInfo类型,它将包括consumer所在的broker path,如果local broker与此path建立了networkConnector,那么此后local Broker将会启动响应的消息转发。

<networkConnector uri="static:(tcp://broker1:61616)">
  <dynamicallyIncludedDestinations>
    <queue physicalName="include.test.foo"/>
    <topic physicalName="include.test.bar"/>
  </dynamicallyIncludedDestinations>
</networkConnector>

 

    Static networks:

    相对于“动态网络”而言,“静态网络”将不依赖Advisory,在任何时候,即使remote Broker中没有相应的consumer,消息也将转发给remote Broker。为了支持这一特性,我们还需要“staticBridge=true”,此参数限定当前networkConnector将不使用advisory感知consumer变更,只关注staticallyIncludeDestinations中的通道。

<networkConnector uri="static:(tcp://broker1:61616)" staticBridge="true">
	<staticallyIncludedDestinations>
		<queue physicalName="always.include.queue"/>
	</staticallyIncludedDestinations>
</networkConnector>

 

    excludeDestinations:

    “排除” 指定的通道,这些通道中的消息将不会转发给remote Broker。在消息转发时或者Advisory中有consumer创建时,都会首先检测其通道是否在excludeDestinations中,如果在,则将不会与remote Broker建立此通道上的任何订阅关系;即使它也存在于staticallyIncludeDestinations或者dynamicIncludeDestinations中。

 

    Failover协议与分布式网络:

    我们可以在Client端使用failover协议,Client可以随机选择指定uri中的任何一个broker进行交互,当broker链接失效后,Client可以尝试重连或者尝试与其他Broker建立链接,failover协议与分布式网络搭配,不仅可以解决Client端故障转移,而且还能配合Broker端消息来实现Client全局负载均衡,让多个Client均衡的分布在多个Broker上。

<broker>
  ...
  <transportConnectors>
    <transportConnector name="openwire" uri="tcp://0.0.0.0:61616" updateClusterClients="true" rebalanceClusterClients="true" />
  </<transportConnectors>
  ...
</broker>

 

    在broker端,transportConnector上支持如下几个属性用来动态调整Client与Broker的链接情况:

    1) updateClusterClients:当网络中,broker节点失效或者broker加入集群,是否通知Client,默认为false;如果希望开启Client动态平衡,首先开启此参数。

    2) rebalanceClusterClients:当有新的Broker加入集群时,是否重新平衡Client链接,默认为false。建议开启为true,此后如果有新Broker加入,那么将有一部分Client断开链接并与新的Broker建立链接。

    3) updateClusterClientsOnRemove:当集群中有broker失效时,是否通知Client,默认为false;建议为true。

 

    当集群中Broker变动时,Client将会在链接上接收到通知,Client可以从通知中获取最新的broker列表。所以,Client甚至不需要配置所有的broker uri,只需要配置一个能够发送通知的broker uri即可(前提是这个broker首次链接必须可用)。

failover:(tcp://primary:61616)

 

    不过,我们还是希望尽可能的多配置几个broker url,以避免primary失效的问题。此外,关于failover协议的更多配置参数,可以参看:【failover协议】

ActiveMQ集群:网络连接模式(network connector)详解 ActiveMQ集群:网络连接模式(network connector)详解 kimmking@163.com 2012-12-26 网络连接模式(network connector) 针对海量消息所要求的横向扩展性和系统的高可用性,ActiveMQ提供了网络连接模式的集群功能。简单的说,就是通过把多个不同的broker实例连接在一起,作为一个整体对外提供服务,从而提高整体对外的消息服务能 阅读详情

相关推荐

Apache ActiveMQ 5.15.5 完整安装与配置指南

本文还有配套的精品资源,点击获取 简介:Apache ActiveMQ 5.15.5是流行的开源消息代理和队列服务器,遵循JMS规范,支持多种消息协议,提供高可用性、可扩展性、持久化、事务支持、网络传输优化、管理工具、消息模型和安全机制。该压缩包含所有必要的组件和文件,通过解压和配置即可启动和管理消息代理,适合构建可靠的分布式消息系统。 1. Apache Act...

weixin_31688273的博客 1811

ActiveMQ 桥接

1.ActiveMQ 网络桥接 1.1 ActiveMQ传输方式 ActiveMQ 按照通信方式划分:桥接转发和双向通信 1.桥接转发是将消息传递给另外一个ActiveMQ的Broker。 2.双向通信是用一个通道既可以收消息,也可以发消息。       这样推送给Broker1的消息会自动转发给Broker2中,Broker2不需要修改任何设置,只对Broker1做修改即可。

古怪的小窝 2891

使用ActiveMQ实现Jms到Jms Bridge的实现

将现有的jms与ActiveMq jms系统集成

activemq网络桥接_ActiveMQ –经纪人网络解释–第5部分

activemq网络桥接 在前面的第4部分中,我们已经看到了如何使用网络连接器在队列中平衡远程使用者的负载。 在第5部分中,如果主题上同时存在多个远程持久订阅者,我们将看到相同的配置如何工作。 考虑以下配置…。 图1:经纪人网络–主题上的负载平衡订户 如上所示,我们有Broker-1,它启动了到Broker-2和Broker-3的两个网络连接器。 生产者将消息发送到Br...

最佳 Java 编程 361

STM32F407硬件SPI驱动ADS1220避坑指南:从寄存器读不到数据到采样值异常的完整解决流程

本文详细解析了STM32F407硬件SPI驱动ADS1220的常见问题与解决方案,包括SPI配置、寄存器读取异常、采样值优化等关键环节。通过CubeMX配置技巧和Keil调试经验,帮助开发者快速排查从通信失败到数据异常的各种问题,实现高精度数据采集系统的稳定运行。

weixin_26878995的博客 158

Localizing LabVIEW Application to Different Languages

本文探讨了LabVIEW应用程序的多语言本地化实现方案。文章首先分析了LabVIEW对多语言的支持现状,指出其默认仅支持ANSI编码,对Unicode支持有限,且仅适配中英法德日韩六种语言。然后重点介绍了JKISimpleLocalization工具包的使用方法,该工具能导出/导入JSON词典文件,实现界面语言的实时切换。文章还结合实际工程案例,分析了该方案的局限性:部分控件不可翻译、切换速度较慢(33个界面需50秒)、小语种支持不足等。最后提供了完整的应用流程和工具包附件,包括词典文件转换工具和工程案例。

2301_80383260的博客 1408

ActiveMQ源码解析(四)Network Bridge

ActiveMQ集群网络 在多个ActiveMQ Broker组成的集群(Network of broker)中,是通过Network Bridge机制来实现的。在阅读源码前,我一直有误解,以为AMQ之间在duplex=false的场景下互相通讯是互相建立消费者客户端,如果生产者连接Broker A,而消费者连接Broker B,那么应该是Broker B先从Broker A上消费消息再发给自己的消费者。可是实际看起来并不是这种简单的机制。今天这篇源码解析,由于牵涉的代码比较多,我尽量用较少的源码来整理出.

BigManing的博客 1060

PCB设计必看:铜皮厚度与载流能力对照表(附Excel计算工具)

本文深入解析了PCB设计中铜皮厚度与载流能力的核心关系,提供了基于IPC-2152标准的动态计算逻辑与实用Excel工具。文章不仅分享了载流对照表,更重点剖析了影响载流能力的关键因素(如铜厚、线宽、温升、布线层),并给出了高电流设计的实战技巧与测试验证方法,帮助工程师规避常见陷阱,实现从理论到实践的闭环设计。

weixin_29228781的博客 721

ActiveMQ源码分析(三):聊聊broker到broker的通讯

Broker到Broker的通讯涉及到activemq集群,主要由network包下的类来实现,我们主要来分析一下NetworkConnector和NetworkBridge类,读者就能大概了解broker的通讯机制了。NetworkBridge是一个借口,所以我们使用 NetworkBridge的子类DemandForwardingBridgeSupport来做讲解。 DemandForwar

flashflight的专栏 3542

halcon3d点云补全方法

属于halcon实例中的内容,后面还接了一部分的匹配

Tianwen_running的博客 1231

黑猫带你学eMMC协议第17篇:超详细的eMMC HS200 & HS400讲解

1 前言 1.1 声明 本文依据eMMC JEDEC5.1及个人工作经验整理而成,如有错误请留言。 本文结合eMMC JEDEC5.1协议手册查看效果更佳。 1.2 内容提要 本文大约6000字,主要内容有: 1.什么是emmc hs200/hs400? 2.什么是tuning?tuning的过程又是什么? 3.如何设置才能让emmc进入hs200 mode? 4.如何设置才能让emmc进入hs400 mode? 5.emmc关于HS200/HS400内部结构框图对比。 6.部分个人相关经验总结。

黑猫奥利奥的博客 1万+

activemq网络桥接_ActiveMQ –经纪人网络解释–第2部分

activemq网络桥接 在此博客中,我们将看到双工网络连接器如何工作。 在上一部分中,我们从broker-1和broker-2创建了一个网络连接器。 我们能够看到,当代理2上有一个使用者使用队列“ foo.bar”时,代理1上的队列“ foo.bar”的消息如何转发到代理2上的队列“ foo.bar”。 让我们尝试通过将消息生成到broker-2的队列foo.bar中并从broker...

最佳 Java 编程 261

Python爬虫实战:携程旅游平台数据爬取(酒店+机票+景点),破解加密与反爬(附完整代码)

携程的反爬机制再复杂,核心逻辑都是“识别非真实用户的请求”,而爬虫的核心就是“让请求看起来像真实用户的行为”。本文的方案从登录态处理、参数加密破解、动态数据抓取,到反爬应对,都是围绕“模拟真实”展开:用Playwright模拟真实浏览器登录,用住宅代理模拟真实用户IP,用随机延迟模拟真实用户的操作频率。掌握了这个核心思路,无论平台的反爬如何升级,都能找到应对方法。当然,爬虫技术是一把双刃剑,合理使用才能发挥其价值。如果你的爬虫项目中遇到了携程的反爬问题,不妨按照本文的步骤试试,大概率能解决问题。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2606

ActiveMQ动态发现集群

1.配置 vim /usr/local/activemq1/conf/activemq.xml 找到broker元素的配置,然后修改brokeName集群中不要重复 然后在transportConnectors 元素前边加上 然后修改transportConnectors元素中的 也就是在默认的值后边加上di

数据之路-忆梦前程 3089

基于Termux的Android平台OpenClaw部署:移动端AI助理实现

本文介绍了在Android设备上通过Termux部署OpenClaw AI助理的方案。Android设备的便携性、Termux提供的完整Linux环境以及多样化的硬件配置使其成为理想的部署平台。文章详细分析了不同级别Android设备的硬件规格(从入门级到旗舰级),并提供了最低/推荐配置要求。部署步骤包括Termux安装初始化、Python环境配置以及性能优化建议。该方案充分利用Android设备的传感器和电池供电优势,为移动办公、学习等场景提供了低成本、高便携性的AI助理解决方案。

博客 3011

【XAI】透视深度学习:CNN与Transformer的可解释性方法

深度学习模型的可解释性方法解析:本文探讨了CNN和Transformer两类主流模型的可解释性技术。针对CNN,介绍了显著性图、类激活图(CAM/Grad-CAM)和基于扰动的方法,通过可视化重要像素区域揭示决策依据。对于Transformer,重点分析了注意力机制可视化及其在文本处理中的应用,并介绍了积分梯度等归因方法。文章包含详细的Python实现示例(使用Captum库),涵盖从MNIST图像显著性分析到BERT文本注意力可视化,为初学者提供了可操作的技术指南。这些方法有助于增强模型透明度,提升AI系

u012133341的博客 382

activeMQ指南针_forwarding bridge的实现机制、使用说明

问题描述:我们想通过forwarding bridge方式联起来多个activeMQ(也就是Broker),但是消息消费者client3接收不到消息。(因该朋友对问题的描述不够详细,我们暂且这么设定问题。希望以后各位提问题最好带上图一所示的消息拓扑图)。 下面我将结合图一所示的消息拓扑图,结合我们分析activeMQ源码,来具体说一下forwarding bridge的工作方式和使用时应注意的地

朱智文的专栏 625

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ActiveMQ桥接以及负载分担

ctiveMQ可以实现多个mq之间进行路由,假设有两个mq,分别为brokerA和brokerB,当有一条消息发送到brokerA的队列test中,有一个客户端连接到brokerB上,并且要求获取test队列的消息时,brokerA中队列test的消息就会路由到brokerB上,反之brokerB的消息也会路由到brokerA。 如果只通过brokerB来消费消息,可以实现桥接。 如果

JIESA的专栏 932

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

mosquitto通配符订阅topic和桥接模式详解

本文介绍了mosquitto如何使用通配符订阅话题和两个通配符的详细用法; 同时,介绍了如何使用桥接模式及桥接模式的意义

Robin's Home 4280

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

架构设计:系统间通信(25)——ActiveMQ集群方案(上)

通过之前的文章,我们讨论了ActiveMQ的基本使用,包括单个ActiveMQ服务节点的性能特征,关键调整参数;我们还介绍了单个ActiveMQ节点上三种不同的持久化存储方案,并讨论了这三种不同的持久化存储方案的配置和性能特点。但是这还远远不够,因为在生产环境中为了保证让我们设计的消息服务方案能够持续工作,我们还需要为消息中间件服务搭建集群环境,从而在保证消息中间件服务可靠性和处理性能。

JAVA入门中 3万+

ActiveMQ伪集群部署

本文借鉴http://www.cnblogs.com/guozhen/p/5984915.html,在此基础上进行了完善,使之成为一个完整版的伪分布式部署说明,在此记录一下! 一、本文目的         介绍如何在同一台虚拟机上搭建高可用的Activemq服务,集群数量包含3个Activemq,当Activemq可用数&gt;=2时,整个集群可用。         本文Activemq的集...

weixin_33924312的博客 251

mosquitto 配置详解(3): bridge的配置

bridge相关的所有配置参数

Robin's Home 2644
上一篇: ActiveMQ与HA架构(master/slave)
下一篇: 新人学步:hbase与hadoop搭建过程
iteye_19607
博客等级 码龄8年 34粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值