L0 服务,一旦故障影响巨大,所以需要保障高可用。
利用 pass 平台,部署时通过环境变量的形式注入集群信息,例如redis cluster信息,在服务发现注册的时候,带入这些元信息。从而达到多集群之间的隔离。
面向各个应用搭建多个集群,例如给稿件服务提供一个账号集群,给游戏服务提供一个账号集群。问题:稿件服务的账号集群挂了,对应流量切换游戏的账号集群去,但是游戏的账号集群并没有稿件的缓存,就会造成 cache hit ratio 下降,DB压力大。解决:多集群不区分使用场景,和多节点类似。
多集群时,会存在多缓存,写操作时需要更新缓存。可以采用订阅mysql binlog,广播到各集群,清理对应缓存。
在一个微服务架构中允许多系统共存是利用微服务稳定性以及模块化最有效的方式之一,这种方式一般被称为多租户(multi-tenancy)。租户可以是测试,金丝雀发布,影子系统(shadow systems),甚至服务层或者产品线,使用租户能够保证代码的隔离性并且能够基于流量租户做路由决策。
测试微服务,是一件很困的事情,在进入dev阶段前,每个feature都需要进行单独的测试。由于服务存在依赖关系,例如feature 1涉及服务A改动,服务A依赖服务B。feature2涉及服务B改动。测试feature 1时,需要保证服务B是稳定版本的。测试期间,有人把服务B升级,用来测试feature 2,从而可能导致feature 1测试异常。
以前公司的解决方案是,2套测试环境+人为安排测试任务。随着业务复杂,需求多,时间紧,不可能一套测试环境一天内就一个测试同学独占着,效率太低。再搭建一套测试环境?硬件成本高、维护也困难、硬件环境不同,难以做负载测试,仿真线上真实流量情况。而且,从目前来看,多套测试环境治标不治本。
还是刚才的feature。
A-feature-1
到测试环境,再进行服务注册时,标识当前服务为A-feature-1
,不是A。test-flag:feature-1
,发起请求。test-flag
,放入context,服务调用时通过gRPC元数据传递context里的test-flag
。test-flag
,从本地负载均衡map里取出对应节点。取不到再通过目标服务名去取,也就是获取稳定版的服务。前面提到过,测试环境和生产环境存在差异,导致压测数据不准确。那能不能直接在生产环境压测,但又不影响生产环境业务的正常使用?当然能,使用多租户的概念即可。
基于上诉的流量隔离可实现在生产环境压测,但这样会影响生产环境的正常业务。可通过影子系统,对基础设施进行隔离。