这次天池中间件性能大赛初赛和复赛的成绩都正好是第五名
,出乎意料的是作为Golang是这次比赛的“稀缺物种”,这次在前十名中我也是侥幸存活在C大佬和Java大佬的中间。
关于这次初赛《Service Mesh for Dubbo》难度相对复赛《单机百万消息队列的存储设计》简单一些,最终成绩是6983分
,因为一些Golang的小伙伴在正式赛512并发压测的时候大多都卡在6000分大关,这里主要跟大家分享下我在这次Golang版本的一些心得和踩过的坑。
由于工作原因实在太忙,比赛只有周末的时间可以突击,下一篇我会抽空整理下复赛《单机百万消息队列的存储设计》的思路方案分享给大家,个人感觉实现方案上也是决赛队伍中比较特别的。
What’s Service Mesh?
Service Mesh另辟蹊径,实现服务治理的过程不需要改变服务本身。通过以proxy或sidecar形式部署的 Agent,所有进出服务的流量都会被Agent拦截并加以处理,这样一来微服务场景下的各种服务治理能力都可以通过Agent来完成,这大大降低了服务化改造的难度和成本。而且Agent作为两个服务之间的媒介,还可以起到协议转换的作用,这能够使得基于不同技术框架和通讯协议建设的服务也可以实现互联互通,这一点在传统微服务框架下是很难实现的。
下图是一个官方提供的一个评测框架,整个场景由5个Docker 实例组成(蓝色的方框),分别运行了 etcd、Consumer、Provider服务和Agent代理。Provider是服务提供者,Consumer是服务消费者,Consumer消费Provider提供的服务。Agent是Consumer和Provider服务的代理,每个Consumer或 Provider都会伴随一个Agent。etcd是注册表服务,用来记录服务注册信息。从图中可以看出,Consumer 与Provider 之间的通讯并不是直接进行的,而是经过了Agent代理。这看似多余的一环,却在微服务的架构演进中带来了重要的变革。
有关Service Mesh的更多内容,请参考下列文章:
- What Is a Service Mesh?
- What’s a service mesh? And why do I need one? (中文翻译)
- 聊一聊新一代微服务技术 Service Mesh
赛题要求
- 服务注册和发现
- 协议转换(这也是实现不同语言、不同框架互联互通的关键)
- 负载均衡
- 限流、降级、熔断、安全认证(不作要求)
当然Agent Proxy最重要的就是通用性、可扩展性强,通过增加不同的协议转换可以支持更多的应用服务。最后Agent Proxy的资源占用率一定要小,因为Agent与服务是共生的,服务一旦失去响应,Agent即使拥有再好的性能也是没有意义的。
Why Golang?
个人认为关于Service Mesh的选型一定会在Cpp和Golang之间,这个要参考公司的技术栈。如果追求极致的性能还是首选Cpp,这样可以避免Gc问题。因为Service M