【RabbitMQ】七、RabbitMQ主备复制是异步仍是同步?

转自:https://yq.aliyun.com/articles/73040?spm=5176.100240.searchblog.116.RcXYdlmysql

咱们知道RabbitMQ能够配置成Queue作主从复制(按照官方的说法叫配置mirror queue),对master queue的写操做会被复制到其余slave上去(也就是复制到mirror queue上去)。这对rabbitmq的这个特性,有些人会问这样的问题,rabbitmq的主从复制是同步的仍是异步的?sql

为何有些人会问这个问题那?主要这些人每每是将rabbitmq这个主从复制过程和mysql的主从复制作类比。咱们知道mysql主从同步是支持同步、半同步、异步3种模式的。采用哪一种模式,决定了mysql的数据可靠性。若是是异步方式主从同步,client发请求给主,当主将数据写入后,从就复制主上的这条的数据,与此同时,主就会告知客户端数据保存成功,可是这时从可能尚未成功的存储这条数据。若是这时主挂掉了,咱们进行主从切换就会丢数据。在要求保证数据可靠性的场景下,咱们不能采用异步模式,咱们须要采用同步模式或者半同步模式,这里咱们就再也不展开同步模式和半同步模式了。这些人将mysql的分析方式放到了rabbitmq,用一样的方式分析rabbitmq的数据可靠性,因此就提出了这样的问题。异步

实际上,rabbitmq的主从复制是异步的,可是rabbitmq并不存在mysql这种场景的丢数据(这句话不是说rabbitmq保证不丢数据)。在这里,咱们来分析一下RabbitMQ的副本复制的过程。spa

首先,咱们来讲一下mysql和rabbitmq的使用接口是不一样的,这时很关键的一点。mysql是同步的接口,也就是说client将sql发给server,server处理sql后将结果返回给client,在server返回client结果前,client不能发起下一个sql的请求。对于rabbitmq来讲,访问接口是异步的。client(咱们这里说的是publisher)向rabbitmq server publish一条消息,在默认的状况下server是不返回成功仍是失败的,也就是说client在不到成功仍是失败的状况下就能够发起下一个请求。若是client关心server是否成功处理完这条消息,能够开启confirm模式,server会异步的返回ack通知client消息投递成功仍是失败。可是client仍然没必要等待收到当前消息的ack就能够继续发下一条。server

接下来,咱们来讲rabbitmq的主从复制过程。实际上,RabbitMQ主从之间的数据复制是异步的,可是在rabbitmq中不会出现mysql那种丢数据的状况,这是由于rabbitmq的接口也是异步的,主收到一条消息写入本地存储,而后在发起写入从的请求。当全部从写入成功后,主才会给client返回ack说此次写入成功了。因此能够看出,虽然rabbitmq的主从复制是异步的,可是而且不会出现mysql丢数据的场景。只要客户端收到ack,就说明这条消息已经写入主和从了。blog

因此须要强调的一点是,同步和异步并不是是决定数据可靠性的关键点。客户端收到成功通知时,全部副本是否写入成功才是判断数据可靠的关键点。由于mysql的接口是同步,因此才须要在主从复制同步仍是异步上作出选择。rabbitmq的接口自己就是异步的接口,因此rabbitmq的主从复制就天然而然的是异步的方式。接口

相关文章
相关标签/搜索