关于实现一个基于文件持久化的EventStore的核心构思

  • 时间:
  • 浏览:1
  • 来源:神彩大发11选5_彩神大发11选5官方

我们都都知道enode框架的架构是基于ddd+event sourcing的思想。我们都都持久化的后该 聚合根的最新具体情况,只是 聚合根产生的领域事件。最近我在思考怎么可不可以实现有3个基于文件的eventstore。目标有有3个:

这篇文章洋洋洒洒,后该 思路性的东西,希望我们都都看一遍过多再枯燥,呵呵。欢迎我们都都提出此人 的意见和建议!

经过了一番调研,发现用文件存储事件非常要花费。要确保高性能,我们都都还可不可以顺序写文件(append),或者随机读文件。不言而喻要随机读文件是将会在当只是command将会操作同有3个聚合根而遇到并发冲突的事先 ,框架可不可以获取该聚合根的所有最新的事件,或者通过event sourcing重建出最新的聚合根,或者再重试那先 遇到并发冲突的command。经过测试,顺序写文件和随机读文件都非常高效,每秒1150W次顺序写和每秒10W次随机读在我的笔记本上后该 问題;将会在enode中,domain是基于in-memory架构的,只是我们都都很少会从eventstore读取事件。只是重点是要优化持久化事件的性能。而读事件必须在command遇到并发冲突的事先 或系统重启的事先 ,才有将会可不可以从eventstore读取事件。只是每秒10W次随机读取应该后该 问題。当然,关于文件怎么可不可以写,见下面的遗留问題的分析。

或者,我们都都主要要确保的是,对同有3个聚合根实例,产生的事件将会版本号相同,则必须有有3个事件能保存成功,只是的认为并发冲突,可不可以告诉组织组织结构有并发冲突了,或者由组织组织结构决定接下来该怎么可不可以做。必须怎么可不可以保证这些点呢?

前面说到,所有聚合根的事件后该 顺序的法律法律法律依据append到同有3个文件,append事件到文件这些步骤并是否必须律法律法律依据检查是否有并发冲突,文件必须帮我们都都持久化数据,不负责检查是否有并发冲突。那怎么可不可以检查并发冲突呢?思路只是 在内存设计有3个Dictionary,Dictionary的key为聚合根ID,value保存当前聚合根产生的事件的最大版本号,也只是 最后有3个事件的版本号。

首先,每个聚合根实例有多个事件,每个时刻,每个聚合根将会后该 产生多个事件或者要保存到eventstore中。为那先 呢?将会我们都都的domain model所在的应用服务器一般是集群部署的,只是删改有将会同有3个聚合根在不同的机器上在被一齐在做不同的修改,或者产生的事件的版本号是相同的,从而就会原因分析并发修改同有3个聚合根的具体情况了。

1.可不可以要高性能;

2.支持聚合根事件的并发持久化,要确保单个聚合根实例过多再保存版本号相同的事件;

从上图还可不可以看出,开启有3个系统进程池,并行操作有3个聚合根,每个聚合根产生10个不同版本的事件(事件版本号连续递增),每个事件重复产生10W次,只花了要花费1s时间。另外,最后每个聚合根的当前版本号以及所对应的事件也后该 正确的。只是,还可不可以看出,性能还不错。有3个系统进程池并行处置,每秒还可不可以处置150W个事件(当然实际肯定没必须高,这里是将会大帕累托图处置都被CompareExchange法律法律法律依据判断掉了。只是,必须没并发的具体情况,才是理想具体情况下的最快的性能点,将会每个事件后该 做持久化和更新当前版本的逻辑,上端的代码主只是 为了验证并发具体情况下是否会产生重复版本的事件这些功能。),且能保证过多再持久化重复版本的事件。明天有空把持久化事件替换为真实的写文件流的法律法律法律依据,看看性能会有几块,理论上假若写文件流够快,那性能应该依旧很高。

在调研的过程中,无意中发现LevelDB的插入性能非常高。它是由Google的MapReduce和BigTable的作者设计的有3个基于key/value形态学 的轻量级的非常高效的开源的NoSQL数据库。它可不可以支持10亿级别的数据量存储。LevelDB 是单系统进程池池的服务,性能非常之高,在一台有3个Q61500的CPU机器上,每秒钟写数据超过40w,而随机读的性能每秒钟超过10w,足见性能之高。正将会他的高效,只是现在只是只是NoSQL都使用它来作为底层的数据持久化,比如淘宝的Tair支持用LevelDB来持久化缓存数据。只是有时间研究下LevelDB的设计与实现非常有必要。或者LevelDB只提供最简单的key/value的操作。对于顺序插入事件的需求,还可不可以调用LevelDB的put操作。或者这里的put操作不支持并发冲突的检测,也只是 将会连续put了有3个key相同的value,则前有3个value就会被后有3个value所覆盖,这后该 我们都都我想要的。只是我们都都将会使用LevelDB,对于同有3个聚合根必须有有3个版本号相同的事件这些需求仍然可不可以我们都都此人 来保证,还可不可以通过上端DEMO中的思路来实现。也只是 说,我们都都仅仅用LevelDB来代替日志。其实原来将会省去我们都都只是的工作量,将会我们都都此人 写日志以及记录每个事件的存储位置和长度后该 一件容易的事情,要求对算法和逻辑非常严紧,或者假若有3个bit错位了,将会读取出来的所有数据都错了。而LevelDB帮我们都都完成了最冗杂和头疼的事情了。但不幸的是,LevelDB必须官方的windows版本。我让我想要找到.net平台下的实现,但要在生产环境使用,还是要多做只是验证才行。另外,将会要用LevelDB来持久化事件,原来们的key还可不可以是聚合根ID+事件版本号的字符串拼接。这点应该没能理解吧!

另外有3个只是 刷磁盘的问題。我们都都知道,通过文件流写入数据到文件后,将会不Flush文件流,那数据有将会还没刷到磁盘。只是可不可以定时Flush文件流,出于性能和可靠性的权衡,选用定时1s刷一次磁盘,通过异步系统进程池刷盘。实际上,大帕累托图NoSQL产品后该 必须,比如Redis的fsync还可不可以指定为每隔1s刷一次AOF日志到磁盘。原来做唯一的问題是断电后将会丢失1s的数据,但这些还可不可以通过在服务器上配置UPS备用电源确保断电后服务器还能工作,来确保断电后还能支持足够的时间确保我们都都把文件流的数据刷到磁盘。原来既处置性能问題,可不可以保证不丢失数据。

上图中的commitlog文件要花费我上端提到的用来存储事件的文本文件,commitlog在metaq消息队列中是用来存储消息的。index文件要花费用来存储事件在commitlog中的位置和长度。在metaq中,则是用来存储消息在commitlog中的位置和长度。只是,从存储形态学 的深度来看,metaq的消息存储和eventstore的事件存储的形态学 一致;但不一样的是,metaq在存储消息时,必须做并发控制,所有消息假若append消息到commitlog即可,所有的index文件也假若append写入即可,关于metaq具体更删改的设计我还没深入研究,有兴趣的我们都都也还可不可以和我交流。而eventstore则可不可以对事件的版本号做并发控制,这是最大的区别。另外,实际上,事件的索引信息还可不可以只可不可以维护在内存中即可,将会那先 索引信息在eventstore启动时突然还可不可以通过commitlog还原出来。当然我们都都维护一份Index文件也还可不可以,只是 会增加事件持久化时的冗杂度,这里到底是否可不可以这些Index文件,我可不可以再研究下metaq可不可以能更进一步明确。

上端还有有3个问題我还没提及,那只是 光用有3个文件来存储所有的事件还匮乏的,我们都都还可不可以有3个文件存储每个事件在文件中的位置和长度,或者我们都都必须律法律法律依据知道每个事件存储在文件的哪里。也只是 在当事件写入到文件后,我们都都可不可以知道当前写入的起始位置,或者我们都都还可不可以将这些起始位置信息再写入到原来要花费索引作用的文件。这些问題下次有将会在删改分析吧,总体思路和淘宝开源的高性能分布式消息队列metaq的消息存储架构非常之类。淘宝的metaq不言而喻能高性能,很大一方面原因分析也是设计为顺序写文件,随机读文件的思路。如下图所示:

或者有有3个法律法律法律依据还可不可以实现并发冲突的检测:

猜你喜欢

前男友跟我分手了,分手后我叫他他对我不冷不热,很冷清,我对他还是放不下,每次他有困难要我帮助他的语

很傻很天真,在感情的句子的句子身前女生智商总是为零的,有时候帮我医学会 控制我本人的感情的句子的句子与情绪,以后才不不受到伤害,对于感情的句子的句子有时候你不成功,但一定要成

2020-01-27

我喜欢上了一个女孩,我向她表白了三次,第一次她说她有男朋友了,这是假的,第二次她说她不想谈恋爱,她

下载百度知道APP,抢鲜体验 我来答扫描二维码下载化工工艺高级工程师我感觉亲们的关系还是本来从头结束了了英语 吧,毕竟那我的事情,从头结束了了英语 比较好,另外我都不

2020-01-27

和男友相处4个月,没有拥抱,没有接吻,只有牵手,正常么?

展开完整版展开完整版 我来答下载百度知道APP,抢鲜体验哈哈哈,亲戚亲戚亲戚朋友一样。我你你这个 都订婚了还没办法 接过吻,搞得我都快怀疑他同性恋了。收起更多回答(5)

2020-01-27

与InheritableThreadLocal相关精彩内容

Java核心技术java系统进程池阿里技术法学会springrequeststaticvoidbeanthreadthreadlocalInheritableThreadLoc

2020-01-27

女友说我理解不了他,说我俩沟通有问题。其实她说什么我都清楚…我说话总说重点,她说话总说一堆。我长期

可选中另1个多 或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问題报告 。扫描二维码下载使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道

2020-01-27