抖音春晚活动背后的 Service Mesh 流量治理技术
本文整理自「火山引擎开发者社区」 Meetup 中的同名分享,主要介绍了抖音春晚红包大规模流量场景下的 Service Mesh 流量治理技术。
背景与挑战
传统微服务的应对
微服务需要通过相互调用来完成原先单体大服务所实现的功能,这其中就涉及到相关的网络通信,以及网络通信带来的请求的序列化、响应的反序列化。 服务之间的相互调用涉及服务发现。 分布式的架构可能需要不同的流量治理策略来保证服务之间相互调用的稳定性。 微服务架构下还需要提升可观测性能力,包括日志、监控、Tracing 等。
在多语言的微服务框架上实现多种功能,涉及的开发和运维成本非常高。 微服务框架上一些新 Feature 的交付或者版本召回,需要业务研发同学配合进行相关的改动和发布上线,会造成微服务框架的版本长期割裂不受控的现象。
自研 Service Mesh 实现
我们不需要把微服务框架众多的功能在每种语言上都实现一遍,只需要在 Service Mesh 的数据面进程中实现即可。 同时由数据面进程屏蔽各种复杂的运行环境,Service 进程只需要和数据面进程通讯即可。 各种灵活多变的流量治理策略也都可以由 Service Mesh 的进程控制面服务进行定制。
Service Mesh 流量治理技术
路由:流量从一个微服务实体出发,可能需要进行一些服务发现或者通过一些规则流到下一个微服务。这个过程可以衍生出很多流量治理能力。 安全:流量在不同的微服务之间流转时,需要通过身份认证、授权、加密等方式来保障流量内容是安全、真实、可信的。 控制:在面对不同的场景时,用动态调整治理策略来保障微服务的稳定性。 可观测性:这是比较重要的一点,我们需要对流量的状态加以记录、追踪,并配合预警系统及时发现并解决问题。
一种是按照比例丢弃流量。比如从 A 服务发出到 B 服务的流量,可以按照一定的比例(20% 甚至更高)丢弃。 另外一种是旁路依赖的降级。假设 A 服务需要依赖 B、C、D 3 个服务,D 是旁路,可以把旁路依赖 D 的流量掐掉,使得释放的资源可以用于核心路径的计算,防止进一步过载。
连接超时带来的错误。 性能会有所降低。
Feature 调试:在线上的开发测试过程中,可以把个人发出的一些请求打到自己设置的泳道并进行 Feature 调试。 故障演练:在抖音春晚活动的一些服务开发完成之后,需要进行演练以对应对不同的故障。这时我们就可以把压测流量通过一些规则引流到故障演练的泳道上。 流量录制回放:把某种规则下的流量录制下来,然后进行相关回放,主要用于 bug 调试或在某些黑产场景下发现问题。
授权:授权是指限定某一个服务能够被哪些服务调用。 鉴权:当一个服务接收到流量时,需要鉴定流量来源的真实性。 双向加密(mTLS) :为了防止流量内容被窥探、篡改或被攻击,需要使用双向加密。
春晚红包场景落地
总结
稳定:面对瞬时亿级 QPS 的流量洪峰, 通过 Service Mesh 提供的流量治理技术,保证微服务的稳定性。 安全:通过 Service Mesh 提供的安全策略,保证服务之间的流量是安全可信的。 高效:春晚活动涉及众多不同编程语言编写的微服务,Service Mesh 天然为这些微服务提供了统一的流量治理能力,提升了开发人员的研发效率。
A:当客户端进程把一个请求放到共享内存中之后,我们需要通知 Server 进程进行处理,会有一个唤醒的操作,每次唤醒意味着一个系统调用。当 Server 还没有唤醒的时候,或者它正在处理时,下一个请求到来了,就不需要再执行相同的唤醒操作,这样就使得在请求密集型的场景下我们不需要去频繁的唤醒,从而起到降低系统调用的效果。
数据面是基于 Envoy 进行二次开发的,语言使用 C++。 流量劫持用与微服务框架约定好的的 uds 或者本地端口,不用 iptables。 Ingess Proxy 和业务进程部署在同样的运行环境里,发布升级不需要重启容器。
相关文章