滥用Git来实施事件存储架构吗?

时间:2019-06-19 16:10:57

标签: git github events architecture event-sourcing

Git本质上是事件存储的一种实现,其中存储的数据是目录结构中的文件。可靠地解决问题是众所周知的:

  • 存储更改历史记录
  • 将最少的数据传输给客户端以获取最新数据
  • 可以回滚到以前的状态

可以通过在Git上编写包装器来创建事件存储。

假设我的业务需求是我需要存储可以用JSON格式表示的客户数据。数据可以通过系统中的一项或多项服务进行修改。我可以有一个专用的Git回购客户数据,该数据具有平面结构和名为{customer-id} .json的文件。当服务修改数据时,它会包含一条有用的提交消息。

该解决方案无法扩展(如果有太多的客户进行了过于频繁的更改,则远程Git服务(例如GitHub)将受到请求和限制的轰炸),但是假设我知道我将拥有约1,000个客户,并且每位客户每10小时有1次数据更改,解决方案还有其他问题吗?

2 个答案:

答案 0 :(得分:1)

使用Git作为数据库通常不是一个好主意。对于此用例,它并不是特别优化的,因为它写入的数据比数据库事务通常所需的数据更多,通常希望将整个树都检出,并且如果将来需要扩展则很难分片。为了复制和可伸缩性,它也不能在多主机模式下运行。

此外,如果您仍然这样做,您的历史记录将以一种病态的方式发展壮大,由于Git更改对象的方式,使得打包和重新打包CPU和内存方面的费用异常昂贵。届时,您的Git托管服务提供商将注意到并要求您移至其他地方,这时您需要切换到真实的数据库。

答案 1 :(得分:0)

  

Git本质上是事件存储的一种实现,其中存储的数据是目录结构中的文件。

-git存储库的排序为您提供了具有happens-before关系的工作树快照,可让您跟踪血统。

就其本身而言,它并不是特别擅长语义。如果需要更多上下文,请参见Working example的讨论,但实际上,您可以使用类似于“编写良好的提交消息”的类比来描述对快照表示所做的更改。

它还通过设计分散化-当您想要的是资本T Truth的中央权限时,这可能会很尴尬。有了权力下放,您必然会更加依赖task-based-ui。不一定,这不是,但是如果您还没有为此预算的话,这可能会令人讨厌。

如果对工作树中的各个文档有明确的责任,这可能会减轻一些压力-假设树中不同部分之间的更改之间的延迟是可以接受的。