支持MapDB的Eventstore
程序员文章站
2022-06-06 11:14:52
...
背景:现在微服务大行其道,虽然微服务开山鼻祖是不建议在微服务下做分布式事务,领域驱动设计早已阐明,具有强一致性要求的一组业务概念,属于同一个聚合,不建议拆到不同服务中,从而尽可能避免分布式强事务一致性的处理。但是不可避免我们没有真的按照DDD领域驱动设计,那么微服务如何保持事务一致性呢?
我们这里采用的EventStore的方式,有基于memory、jpa、jdbc等方式,我今天采用了MapDB framework的方式,MapDB提供多种多样方式的数据结构有link、set、map、queue等。
EventMessage
public interface Message<T> extends Serializable { String getIdentifier(); MetaData getMetaData(); T getPayload(); Class<T> getPayloadType(); Message<T> withMetaData(Map<String, ?> metaData); Message<T> andMetaData(Map<String, ?> metaData); }
MapDB eventStore
/** * Created by Young on 2017/4/11. */ public class MapDBEventStorageEngine implements EventStorageEngine { private final DB db = DBMaker.memoryDB().make(); private static final String ORDER_LINK_LIST = "ORDER_LINK_LIST"; private final Lock lock = new ReentrantLock(); private final Condition dataAvailableCondition = lock.newCondition(); @Override public void appendEvents(List<? extends EventMessage<?>> events) { lock.lock(); try { IndexTreeList<Object> hs = db.indexTreeList(ORDER_LINK_LIST).createOrOpen(); hs.addAll(events); } finally { lock.unlock(); } } @Override public void storeSnapshot(DomainEventMessage<?> snapshot) { } @Override public Stream<? extends TrackedEventMessage<?>> readEvents(TrackingToken trackingToken, boolean mayBlock) { return null; } @Override public DomainEventStream readEvents(String aggregateIdentifier, long firstSequenceNumber) { return null; } @Override public Optional<DomainEventMessage<?>> readSnapshot(String aggregateIdentifier) { return null; } }
推荐阅读
-
支持start,stop,restart的运行脚本
-
支持start,stop,restart的运行脚本
-
浅析THINKPHP的addAll支持的最大数据量_php实例
-
方便代理下单的EcStore收货地址一键分析插件,同时支持淘宝/京东/一号店,ecstore
-
python支持断点续传的多线程下载示例
-
让IE8和IE9支持eWebEditor在线编辑器的方法
-
php支持的协议和封装协议
-
基于jQuery的让非HTML5浏览器支持placeholder属性的代码_jquery
-
php 无限级分类,超级简单的无限级分类,支持输出树状图_php技巧
-
c#开发webapi挂载到iis,支持vue跨域corb访问的设置