存储后端如何影响Datomic?

kon*_*onr 34 postgresql clojure amazon-dynamodb datomic

我该如何选择Datomic的后端存储服务?

选择DynamoDB而不是Postgres是优先考虑的问题,还是每个选项都有不同的权衡?如果是这样,他们是什么?

a2n*_*ade 22

存储服务要求

Datomic的存储服务通常应满足3个要求:

  1. 实现键值存储语义:使用索引键的值进行高效的读/写访问
  2. 支持一致的读取.例如,阅读你自己的写作.理想情况下,无争用/无锁读取.
  3. 支持条件投注.例如乐观锁定+快照隔离.

Datomic使用存储服务来存储已排序的压缩数据块,类似于传统数据库系统使用文件系统的方式,上述要求几乎是底层存储服务和Datomic之间的API.因此,存储服务的选择取决于它们支持这三个要求的程度.

编写可伸缩性

Datomic通常不会对底层存储服务施加很大的写入压力,因为只有一个组件写入它,即Transactor.此外,Datomic使用后台索引作业,一旦积累了新的内容(默认情况下为~32MB但可以配置),就可以将新颖性集成到存储中,这进一步降低了常量写入负载.Datomic立即写的唯一东西是事务日志.

读可伸缩性

Datomic使用多层缓存,即memcached和peer缓存,因此在理想情况下,即当工作集适合内存时,系统也不会产生很大的读取压力.

系统负载

如果您的系统不需要巨大的写入可扩展性并且您的应用程序数据往往适合内存,那么选择特定的存储服务是无关紧要的,当然,除了它们的操作功能(备份,管理工具等)之外与Datomic无关.

另一方面,如果您的系统确实需要巨大的写入可扩展性,或者您拥有大量的对等体,那么每个对等体都需要处理的数据超过其内存中的数据(迫使大量数据段从存储中获取),您需要一个可以横向扩展的存储系统,例如DynamoDB.正如其中一条评论中所提到的,如果您需要任意写入可扩展性,那么无论如何,Datomic都不适合您.