作者回复: Redis 高可用是满足要求的,只不过 Redis 的高可用需要我们自己来运维,比如通过哨兵机制在检察和剔除出现故障的节点等,而 etcd、ZooKeeper 和 Eureka 它们的高可用是系统自带的,所以课程中说 Redis 高可用的运维成本高。
作者回复: 整体思路非常正确,有两个细节问题: 1、服务的调用流程,获得ip后,通过ip路由的过程,一般是 局域网 -> NAT -> 公网。 2、“DNS 域名到ip 映射修改是CP (必须成功)”,DNS域名到ip是AP的,C 强调的是修改多节点的数据是原子和瞬时的,和单节点的一样,一致性的讨论在后面「一致性与共识」中会讨论。
作者回复: 是的
作者回复: 首先,一般来说,为了平滑升级,服务发布都是滚动的,也就是说同一个服务的多个实例的发布不是一个原子和瞬间操作,所以正常情况下也会存在新老版本共存的情况。 其次,客户端是通过网络去服务注册发现中心获取服务的列表是通过网络的,可能有的客户端 A 10 ms 就获得到最新的列表了,客户端 B 由于网络丢包,经过重试 30 s 后才获得列表,这里就导致就算服务注册发现中心内部是CP的,但是从客户端获取服务列表的角度来看,依然是最终一致性的。 最后,关于你这个场景,如果需要一个信息在多实例上同时生效,比较好的方式是通过配置信息来实现,在后面的课程「配置中心」中有详细的讨论。
作者回复: 如何优雅的摘掉一个发生故障的服务,让注册中心处理还是让上游服务调用时发现故障通报注册中心? 实例在注册发现中心上的注册信息是有时效性的,如果一个服务的实例发生故障,这个实例就不会再次和注册发现中心发送心跳或者注册了,这个实例的注册信息就会因为过期而被删除了 如果这个服务有十个接口,只有其中的一个接口出了故障,能做到接口级别的隔离吗? 注册发现中心是关注实例层面的,对于接口层面不应该由注册发现来处理,不过熔断机制可以进行隔离,在后面的课程中会讨论这个问题。 云原生是大趋势,利用Service来进行服务发现和负载均衡的方向是正确的。 关于“比如一个量化交易系统CP应该比AP更合适。”的问题,在前面的问题中回复了,这里就不重复了。
作者回复: 1、从稳定性角度,可以避免相互影响 2、从成本角度,比如A模块需要ssd磁盘200G,B模块只需要普通磁盘200G,如果一台机器就需要400G的ssd磁盘(当然可以一台机器挂两块盘,ssd和机械盘各200g,但是对于运维部署的成本很大)
作者回复: 是的,不需要了
作者回复: 对于 mysql 和 redis,如果不要求高可用,是可以实现强一致性的,比如同步复制,比如主不可以切换等操作。 高可用问题和一致性问题很多时候是可以相互转换的,CAP😀
作者回复: 服务发现是服务治理的一部分,是在微服务服务太多的情况下自动化运维服务的,如果从不更新,也就是运维成本低,那也不用服务发现也可以。 不过正常情况来说,服务发现就是非常方便集成的,集成一个 SDK就行,服务网格则更简单,新的服务应该使用。 版本变更的时候,可以通过注册发现发现新版本的服务。
作者回复: 后面的课程,“复制”和“一致性与共识”序列有详细介绍