<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.riguz.com/index.php?action=history&amp;feed=atom&amp;title=Blog%3A%E5%85%B3%E4%BA%8EEvent_Sourcing%E6%9E%B6%E6%9E%84</id>
	<title>Blog:关于Event Sourcing架构 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.riguz.com/index.php?action=history&amp;feed=atom&amp;title=Blog%3A%E5%85%B3%E4%BA%8EEvent_Sourcing%E6%9E%B6%E6%9E%84"/>
	<link rel="alternate" type="text/html" href="https://wiki.riguz.com/index.php?title=Blog:%E5%85%B3%E4%BA%8EEvent_Sourcing%E6%9E%B6%E6%9E%84&amp;action=history"/>
	<updated>2026-06-03T00:55:09Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://wiki.riguz.com/index.php?title=Blog:%E5%85%B3%E4%BA%8EEvent_Sourcing%E6%9E%B6%E6%9E%84&amp;diff=2651&amp;oldid=prev</id>
		<title>imported&gt;Riguz：​在微服务实践中，也许一致性是最头疼的问题了，因为跨数据库的事物将变得十分困难。我们让每一个微服务的数据存储都私有化来实现服务之间的解耦，无可避免存在很多业务需要操作多个微服务的数据库，可能不仅仅是跨服务的不同表，还可能是不同的数据库类型。如果我们采用一个数据库可能事情就会简单了，但这就脱离了微服务的真正价值了。</title>
		<link rel="alternate" type="text/html" href="https://wiki.riguz.com/index.php?title=Blog:%E5%85%B3%E4%BA%8EEvent_Sourcing%E6%9E%B6%E6%9E%84&amp;diff=2651&amp;oldid=prev"/>
		<updated>2017-06-23T00:00:00Z</updated>

		<summary type="html">&lt;p&gt;在微服务实践中，也许一致性是最头疼的问题了，因为跨数据库的事物将变得十分困难。我们让每一个微服务的数据存储都私有化来实现服务之间的解耦，无可避免存在很多业务需要操作多个微服务的数据库，可能不仅仅是跨服务的不同表，还可能是不同的数据库类型。如果我们采用一个数据库可能事情就会简单了，但这就脱离了微服务的真正价值了。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
在微服务实践中，也许一致性是最头疼的问题了，因为跨数据库的事物将变得十分困难。我们让每一个微服务的数据存储都私有化来实现服务之间的解耦，无可避免存在很多业务需要操作多个微服务的数据库，可能不仅仅是跨服务的不同表，还可能是不同的数据库类型。如果我们采用一个数据库可能事情就会简单了，但这就脱离了微服务的真正价值了。&lt;br /&gt;
&lt;br /&gt;
现阶段解决分布式事物大致有这些方案：&lt;br /&gt;
&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Two-phase_commit_protocol 2PC]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Three-phase_commit_protocol 3PC]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Paxos_(computer_science Paxos])和[https://raft.github.io/ Raft]&lt;br /&gt;
* [http://cdn.ttgtmedia.com/searchWebServices/downloads/Business_Activities.pdf TCC]&lt;br /&gt;
&lt;br /&gt;
姑且不论实现的复杂性，以上方案大多数可以实现[https://en.wikipedia.org/wiki/Eventual_consistency 最终一致性]。为什么说大多呢？因为太复杂了，我还没研究清楚...&lt;br /&gt;
&lt;br /&gt;
而Event Sourcing目测是一个更简单的实现最终一致性的方案，采用Event Sourcing + CQRS来实现读写分离，具体是什么关系呢?这里引用一点：&lt;br /&gt;
&amp;gt;在CQRS中，查询方面，直接通过方法查询数据库，然后通过DTO将数据返回。在操作(Command)方面，是通过发送Command实现，由CommandBus处理特定的Command，然后由Command将特定的Event发布到EventBus上，然后EventBus使用特定的Handler来处理事件，执行一些诸如，修改，删除，更新等操作。这里，所有与Command相关的操作都通过Event实现。这样我们可以通过记录Event来记录系统的运行历史记录，并且能够方便的回滚到某一历史状态。Event Sourcing就是用来进行存储和管理事件的。&lt;br /&gt;
&lt;br /&gt;
再来看一张图:&lt;br /&gt;
&lt;br /&gt;
[[File:https://www.codeproject.com/KB/architecture/555855/CQRS.jpg|600px|CQRS]]&lt;br /&gt;
&lt;br /&gt;
参考文章:&lt;br /&gt;
&lt;br /&gt;
* [https://mp.weixin.qq.com/s?__biz=MzA5Nzc4OTA1Mw==&amp;amp;mid=2659597948&amp;amp;idx=1&amp;amp;sn=754df1597fd042537be8c25d073d3c98&amp;amp;scene=0#rd 基于Event Sourcing和DSL的积分规则引擎设计实现案例 ]&lt;br /&gt;
* [https://www.nginx.com/blog/event-driven-data-management-microservices/ Event-Driven Data Management for Microservices]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/CAP_theorem CAP]&lt;br /&gt;
* [https://martinfowler.com/eaaDev/EventNarrative.html Focusing on Events]&lt;br /&gt;
* [https://www.martinfowler.com/eaaDev/RetroactiveEvent.html Retroactive Event]&lt;br /&gt;
* [https://www.martinfowler.com/eaaDev/DomainEvent.html Domain Event]&lt;br /&gt;
* [https://github.com/cer/event-sourcing-examples Event-Sourcing+CQRS example application]&lt;br /&gt;
* [http://kb.cnblogs.com/page/161050/ 领域驱动设计(Domain Driven Design)参考架构详解]&lt;br /&gt;
* [http://codebetter.com/gregyoung/2010/02/16/cqrs-task-based-uis-event-sourcing-agh/ CQRS, Task Based UIs, Event Sourcing agh!]&lt;br /&gt;
* [www.codeproject.com/Articles/555855/Introduction-to-CQRS Introduction to CQRS]&lt;br /&gt;
* [https://ookami86.github.io/event-sourcing-in-practice/ Event Sourcing in practice]&lt;br /&gt;
* [http://thinkbeforecoding.com/post/2013/07/28/Event-Sourcing-vs-Command-Sourcing Event Sourcing vs Command Sourcing]&lt;/div&gt;</summary>
		<author><name>imported&gt;Riguz</name></author>
	</entry>
</feed>