【HBZ分享】谈谈服务注册中心原理,以及服务剔除策略

服务是如何注册的

  1. 客户端通过心跳机制,实际就是向服务端定期发送注册请求,请求参数要带上【服务名】和【ip地址】。如果是第一次则会进行注册,如果不是第一次,就会进行续约
  2. 服务端需要开启一个心跳续约接口,和服务注册同一个接口即可,接收到心跳请求,要判断【服务名】是否存在,如果不存在,说明该服务第一次注册,直接加入到map集合,并设置好当前时间为续命开始时间。如果【服务名】本身就存在,还要判断,该服务ip是否存在,如果存在,说明这个请求是个续约请求,把续命时间改成当前时间即可;如果服务ip不存在,说明该服务是个集群,该请求是个新节点来注册了,则需要把ip加入到内层map中,并配置好续命时间为当前时间

服务是如何续约的,不续约又会怎样

  1. 每个服务的客户端都要定时的向服务端心跳接口去发送请求,每次请求成功,服务端都会将该服务的该节点的续约时间更新
  2. 如果不续约,会触发服务剔除机制,该服务即使没宕机,也会被剔除注册中心,到时该服务就变成了不可见状态

服务端如何做服务剔除机制

  1. 服务端会启动一个定时器,比如每3秒会扫描整个map集合, 会把保存的续约开始时间和当前时间进行作差,如果超过10秒,就认为长时间没来续命,直接剔除即可
  2. 还要给出一个服务下线的接口,如果服务正常停止,会触发容器销毁的回调方法,该方法会调用服务端服务下线接口,主动的将服务剔除

服务端如何避免客户端获取一个宕机的ip地址

  1. 服务端要做好服务剔除策略
  2. 服务正常停止:首先要有一个主动的服务下线接口,正常服务停止会再销毁容器回调方法去主动调用服务下线接口
  3. 服务异常停止:异常停止的服务,比如强行杀掉服务进程,此时不会走容器销毁的回调方法,所以无法主动将服务下线,那此时服务端只能靠自身检测机制,去把长时间没发心跳的服务剔除

异常停止的服务ip在未到检查期间被获取了如何解决?

  1. 场景:服务异常停止无法主动下线服务,则此时恰好还没到服务端轮询检查的时间点,此时宕机ip依然存在于注册中心
  2. 解决方案:因为客户端在获取指定服务所有的ip地址,会拿到该服务所有对应的ip的list集合,自然也包括宕机的ip。如果此时负载均衡策略恰好拿到了宕机ip进行发送http请求,那必然是不通,会返回5xx的报错,此时只需要从list集合中再拿下一个ip地址,重试一次即可,如果集合所有ip都调不通,那说明所有节点都宕机了,那就没办法了
要保证消息的顺序消费,可以采取以下几种方法: 1. 在RabbitMQ中,可以将带有顺序性的消息放入同一个队列(queue)中,并且只有一个消费者来消费该队列。这样可以确保消息按照顺序被消费,避免负载均衡的情况发生。 2. 在Kafka中,可以将消息放入同一个分区(partition)中,并且由同一个消费者来进行消费。这样可以保证消息按照分区的顺序被消费。可以直接指定某个分区来放置消息,或者通过hash取模的方式将具有相同特定值的消息放到同一个分区中。 3. 在RocketMQ中,可以使用MessageListenerOrderly,它自带单线程消费消息的功能,这样就不需要在消费者端再使用多线程去消费消息。同时,还要确保需要顺序消费的消息进入同一个队列中,这样就能保证顺序消费的实现。 需要注意的是,顺序消费会导致负载不均衡和性能下降的问题。因为同一个队列或分区只能由一个消费者进行消费,无法进行负载均衡;而使用hash取模的方式可能会导致某些分区的消息很多,而某些分区的消息很少,产生倾斜效应。这些是顺序消费需要考虑的后果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【HBZ分享】MQ如何保证消息的顺序消费](https://blog.csdn.net/a645293829/article/details/125342165)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [如何保证消息队列里消息的生成和消费的顺序性](https://blog.csdn.net/bboy66/article/details/124408040)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值