Skip to main content

Command Palette

Search for a command to run...

为什么微服务适合我们

Updated
1 min read

最近的爆款文《Segment 放弃了微服务》流传很广,让我想到了 2015 年底,Segment 的一篇关于微服务的文章。似乎目前没有中译文,因此翻译出来,便于对照。

原文:Why Microservices Work For Us

作者:Calvin French-Owen

在 Segment,我们全心拥护微服务理念,但个中原因,可能并不是读者所以为的那样。

微服务和单体的争论已经够多了,我不想再次复盘。微服务的拥趸们说,微服务有更好的伸缩能力,是清晰软件工程师团队责任的的最佳方式。然而单体应用的拥护者则认为,微服务的运维太复杂,难于启动。

但是微服务的主流益处和今天我们要讨论的好处不太相关,我们要讨论的是:可观察

当周二凌晨 3 点钟收到传呼的时候,如果看到特定的工作单元出了问题,而无需在单体应用的每个函数调用中加入追踪,那这个过程就轻松百倍了。

并不是说紧耦合代码中无法实现良好的可观察性——只是极少有案例能够从第一天开始就具备完善的可观察性支持。


可观察性从何而来?稍作思考,就能列出 htopsysdigiftopps 等运维工具。

但是这些都不是用来监控单一程序的执行情况的:热门执行路径、堆栈尺寸等。过去 20 年中,我们打磨出来的工具都是围绕主机、进程或设备进行的。

在分布式系统中,我们可以在我们的监控指标中加入请求和网络吞吐,但是多数工具还是会尝试聚合到主机或者服务的级别。

单体应用中,以进程为中心的监控工具很难感知到一个程序的耗时情况。在单体应用中,我们最好的调试方式,要么是用 Profiler 运行程序,或者实现自己的计时指标。

还有更头痛的事情,正因为我们没有能够在函数级别完成监控,才成全了火焰图,令其成为流行工具。

所以在 Segment,我们不再尝试往单体应用中塞进大量功能,而是在微服务方向花大力气。我们打赌,容器调度和编排会变得更简单也更强大,而多数指标和监控会持续以主机和服务为中心。

这里做个提醒,微服务仅在容易创建新服务的情况下才奏效。否则我们只是把可观察性问题替换成了交付问题了。

在另外一篇文章中,我们讲了一下我们服务的大体情况,以及我们是如何使用 Terraform 的。如今我们开始把每个服务拆为模块,所以我们可以在预备和生产环境中复用同样的配置了。

这里有个认证服务的例子,使用 Terraform 来进行资源分配:

/**
 * Task definition.
 */

module "task" {
  source = "../task" # sets up an ECS task

  name = "auth"
  port = 5027
  image = "segment/auth
  image_version = "latest"
}

/**
 * Service implementation.
 */

module "service" {
  source = "../service" # sets up our shared service resources

  # Module variables
  task = "${module.task.arn}"
  name = "${module.task.name}"
  port = "${module.task.port}"

  # Input variables
  iam_role = "${var.iam_role}"
  zone_id = "${var.zone_id}"
  elb_subnets = "${var.elb_subnets}"
  elb_security_group = "${var.elb_security_group}"
  cluster = "${var.cluster}"
  desired_count = "${var.desired_count}"
  environment = "${var.environment}"
}

如果感到好奇,可以看看完整的模块定义的例子

这里有着显而易见的好处(监控指标)和很低的成本(少量的 Terraform 脚本),因此我们就不再需要将不同的功能挤到一个现存服务之中了。


目前为止,这套方法很有用。

Segment 有点不同寻常:并非微服务们协调工作,我们有大量称为 microworker 的单元。基本上这是同样的概念,不过 Worker 不为客户请求提供服务,而是从队列中读取数据,进行处理之后,然后给消息做一个 ACK。

Worker 没有依赖,因此它比服务简单很多。没有耦合,因此不用担心一个 Worker 中的问题会影响到系统中的其它成员。

实际工作中,有很多因素迫使我们做出了 microworker 的决定。其中最大的因素是我们的团队规模以及我们要尝试构建的产品的规模。

微服务经常的宣传就是,当团队规模变大时,太多人在编写同一套代码。这种情况下,以团队为单位分配代码库的权限是个自然的举措。但是我们认为,对小团队来说,微服务也一样有好处。

很多和我交流的人都吃惊于我们团队的规模之小,列几个数字来证明一下:

  • 400 个私有仓库

  • 70 个不同的服务(Worker)

  • 10 个工程师

我们的产品规模和团队规模形成了鲜明的对比。所以如果我接到告警,告警可能是我编写的代码导致的,这段代码我半年前开发出来之后就再没朋友。

如此情况下,小型的、定义清晰的服务就很有吸引力了。

下面是一个典型场景:因为队列深度导致的告警。

我们可以在队列的监控中检查一下是否是这个原因。

我们可以清楚的知道是哪个 Worker 出了问题(因为每个 Worker 都会订阅单独的队列),也知道去哪里看日志。每个服务日志都有自己的标签,所以我们无需担忧同一应用中不同请求生成不相关的日志造成的干扰。

我们可以在 Datadog 的独立的 Dashboard 上查看这个 Worker 的 CPU、内存,以及 ELB 报告的延迟。一旦我们识别了问题,只要阅读 50-100 行文件就可以获知问题的确切位置(例如内存泄漏)。

在单体应用中,我们也可以为每个端点加入特定的监控。然而如果每个端点都运行在各自的进程中,我们完全可以自由的进行修改,无需担心影响其它部分。

还没有提到的是,微服务让我们有了隔离 CPU、内存和延时(如果是 ELB 代理的服务)的能力。同样是查找一处内存泄漏,在有上百个端点的单体应用的代码中查找,和在一个 Worker 的百多行代码中进行查找,其难度是不可同日而语的。


我理解,这种方式不会适用于所有场合。为了在创建新服务时能够获得所有支持,需要很大的投入。这种投入会受到团队、工作负载以及产品形态等多种因素的影响,可能不那么理想。

但是对任何产品来说,一旦其运行过程存在复杂的运维和负载,我会选择微服务架构。这种架构让基础设施有弹性、可伸缩,并易于监控,无需牺牲开发人员的生产力。

More from this blog

龙虾恐慌:AIOps 又要改名了?

ChatGPT 开始,把 AI 拉近到普罗大众的面前,让无数人感受到 AI 的亲民魅力。而龙虾,则把大模型驱动的自动化能力,突然间变得水灵灵、活泼泼地走进千家万户。它不只是“风口上的猪”,而是风口本身。热度高到让 Mac mini 一度断货,不知道这在不在库克的预料之内。 每代人都有每代人的鸡蛋,春节期间,我就领了我的鸡蛋。翻出古老的 MacBook Air M1,充值各种大模型。当然了,这个工具

Mar 9, 20261 min read

再见 2025

我猜不少人以为这个号废了吧?并没有,只是今年变化有点大,一直有种抄起键盘,无从说起的感觉,所以一直偷懒到今天,2025 的最后一天。 今年是我的第四个本命年,去年末一期播客里,大内说本命年不是灾年,是变化年,有危也有机。可是讲真啊,只看到危,没看到机。 各种因缘际会,从鹅厂跳槽到前东家,已经接近四年,第一个合同期已经进入尾声。除了前两年还在云原生领域嗷嗷叫,后两年基本都是些鸡零狗碎的东西了,用老东家的术语说是——偏离主航道,可谓是前景暗淡了。 一旦确定要滚蛋,反倒心思轻松起来,每天骑着我的小红车...

Jan 5, 20261 min read

辅助编程?dora 说:我知道你很急可是请你别急

从 OpenGPT 把大模型的火烧旺了之后,这三年来,相信很多组织或摩拳擦掌、或躬身入局,希望借助聪明能干的大模型,或想偿还技术宅,或想降本增效,或想弯道超车。一时间,沉寂许久的 AIxx 又活过来了,LLM Ops、Vibe Coding、中医大模型、GPT 算命等等,全都老树发新芽,焕发了勃勃生机。那么视角拉回从业者最关注的饭碗相关的领域之一——AI 辅助开发,产生了什么触动,应该如何拥抱呢? DORA 的年度报告中给出了很有意思的结论——强者恒强。 执行摘要部分总结了几个有趣的点: 问题...

Oct 6, 20251 min read

[译]dora:ai 辅助软件开发状态报告

执行摘要 在 2025 年,科技领导者面临的核心问题已不再是“是否要采用 AI”,而是“如何实现其价值”。 DORA 的研究基于超过 100 小时的定性访谈和来自全球近 5,000 名技术专业人士的问卷调查。研究揭示了一个关键事实:AI 在软件开发中的主要角色是“放大器”。它会放大高效能组织的优势,也会凸显组织的缺陷。 关键结论:AI 是放大器 AI 投资的最大回报并非来自工具本身,而是来自组织底层系统的战略性建设: 高质量的内部平台 清晰的工作流 团队的协同能力 缺少这些基础,AI ...

Oct 2, 202514 min read

僭越了,有人在用 Rust 写 Kubernetes

一个新语言问世,最爱做的事情之一,就是重写存量软件了。 云原生喝酒 SIG 重点扶持项目——rk8s(https://github.com/rk8s-dev/rk8s) 也可以归在这个范畴里,只不过这个项目重写的东西比较大,是 Kubernetes。 从 2025 年 1 月第一个 Commit 开始,到现在有了 200 多次 Commit,十几万行代码。当然距离 Kubernetes 的几百万行代码还差得远——老马就是喜欢整这种大无畏项目。 另外该项目也是国内第一个脱离 Cargo 转向使用 ...

Sep 27, 20253 min read

【伪】架构师

342 posts