1、metaq如何做集群?
broker做集群。使用相同的server.ini文件,修改brokerId即可,不需要重启productor,其他broker,以及消费者,他们会自动感知到新加入的broker
消费者做集群
多个服务器可以组成一个集群来消费同一个topic的消息,需要这些消费者要用相同的groupid
2、metaq如何做failover(故障转移)?
当某个broker重启或者不能提供服务的时候,生产者可以通过zk来感知到这个变化,将失效的分区移除,从而做到failover,但是故障感知会有一点延迟,可能在这个期间消息会发送失败
当消费集群中的某个消费者挂了,其他消费者会感知到,并重新进行负载
3、负载均衡
生产者负载。生产者启动的时候会从zk上获取topic对应的broker和分区列表,默认的负载均衡策略是轮询,也可以自定义负载均衡策略
消费者负载。消费者负载策略如下:
每个分区对同一个group只能挂载一个消费者
如果同一个group下的消费者数量大于分区数,多余的消费者不参与消费
如果同一个group下的消费者数量小于分区数,有的消费者需要承担额外的消费任务
4、消费者分组 group
同一个topic下的消息可以由多组消费组来消费,不同的消费者的处理逻辑和业务处理是不同的,消费速度和消费进度也是不一样的。同一个分组的消费者都只能消费部分消息,不会重复消费,不同分组的消费者可以重复消费同一个topic的消息。
5、可靠性保证
生产者发送消息的可靠性保证
生产者发送消息会等待broker的响应结果,返回成功或失败的标志,如果成功说明该消息已经接收到并存入磁盘,这个过程是个同步的过程,如果返回失败,生产者会重发这个消息,所以这当前一条消息已经存入磁盘但是因为网络的原因导致没有返回响应,有可能引起消息的重复。
broker存储消息的可靠性保证
broker收到生产者发过来的消息后,校验后会存入磁盘,写入成功后才返回响应。并且broker会在收到1000消息或每隔10s钟自动刷新到磁盘中
6、消费者消费消息的可靠性
消费者是一条接一条的消费消息,只有前一条消息消费成功才会消费下一条消息,如果消费失败会重试5次,如果还是失败会将这条消息存入本地磁盘,然后又后台线程继续重试,主线程继续往后走。另外消费者消费的可靠性和offset存储紧密相关,offset记录消费的偏移量,如果消费者消费成功后没有能成功的offset存起来,那么同一个group的其他消费者就会再次消费这个消息,从而造成消息重复。offset的存储可以存在zk、mysql、文件中,如果存在zk中,zk的可靠性就决定了metaq消费消息的可靠性
7、消息顺序的保证
metaq消费者按照消息存入磁盘的先后顺序来消费消息,