翻译:为什么 Kafka 不适合做 Event Sourcing

原文地址:https://medium.com/serialized-io/apache-kafka-is-not-for-event-sourcing-81735c3cf5c
作者:Jesper Hammarbäck
在学习 Event Sourcing 相关知识的时候,发现 Kafka 对消息持久化的方式特别适合 Event Sourcing,在查阅资料过程中发现早有前人讨论了这个设想。
非英语专业,文章偏向意译,不准确的地方请多包涵。

Kafka 作为一个消息中间件是一个非常好的工具,同时对 topic 持久化的能力让你可以永久————如果你希望的话————将 messages 保存下来。(the optional topic durability allows you to store your messages permanently)

因此,如果你的 messages 是 event 的话,你可以使用 kafka 来做 event store 或者 event log,但是它真的不是一个做 event sourcing 的好工具。

下面将讲述理由。

加载实体当前状态(Loading current state)

当一个服务接受一个 command,要求改变一个使用了具有事件溯源的实体(event sourced entity),我们首先要重建这个实体的当前状态。我们通过从 event store 中加载特定实体 ID 的所有事件并重新应用我们的实体(的初始状态),得到了实体的当前状态。

(但是)获取某个特定实体的所有 event 并非一件易事,Topic 通常以各种实体类型(如 “Orders”、“Payments”、“Notifications”)集中并分区(centered around and partitioned),因此我们必须要遍历所有“Orders”的所有 event,去获得某个特定的实体的当前状态。尽管这是可行的,却不实际。

一个代替方案是一个实体拥有一个 topic,但是这样我们就将面临成千上万的 topic,并且更困难的是,下游的订阅服务(译者:消费者)需要自动发现承载一个 entity 的最新的 topic。同样的,不实际。

写入一致性 (Consistent writes)

当我们的实体重建了,这时候该执行刚刚接受的 command 所包含的业务逻辑了。如果业务逻辑失败,我们会向客户端返回一个 error,如果成功,将会提交一个新的 event。这样,我们就必须保证不能有同一个实体的别的 event 同时保存到我们的 event store 中去,否则我们将承担破坏我们领域对象的一致性。

用 OCC 进行补救 (OCC to the rescue)

一个保证写入一致性的方法是运用 event store 的 optimistic concurrency control。一个像样的 event store 应当让用户做出 “保存这个 event 当且仅当这个实体的版本仍然是 x” 这种控制。Kafka 并不支持这个(<这里的引用是KAFKA-2260,在18年的时候有个大哥写了个comment说这里已经解决这个问题>),该领域专家建议的解决方法似乎是在之前放置一个“数据库”以提供一个一致性点。尽管此建议在某些情况下可能是可行的解决方案,但从长远来看,选择更适合特定问题的工具可能更明智。

单一写入 (Single-writer)

另一个保证一致性的方法就是保证顺序写入,比如使用 single-writer principle,意思就是,我们保证所有某个 id 的实体的写入都会在同一个线程发生。我们可以通过保证生产者(producer)同时是自己的消费者(consumer),从而有效地阻塞该 event,直到该 event 提交并在 Kafka 的另一端可用。这种设计会对性能产生严重影响,尤其是考虑到上面谈到有限的加载实体的功能。

究竟合不合适 (Does it fit at all?)

所以,一个 event sourcing 的系统设计中能容下 Kafka 吗?也许。可能。作为将事件传输到下游查询服务或读取模型的一种方式,它可能是对事件存储的一个很好的补充。

但是,在向我们的系统中添加大型而复杂的基础架构时,我们应始终谨慎————一切都是有代价的,因此请确保它足以应付当前的问题!

如果您想开始做 event sourcing,而且你重视 HTTP 的简单性并欣赏 hosted service,请看一下我们在 Serialized(译者:稍微看了一下,貌似是一个 Event Store)所做的工作。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354