使用Cassandra建立一个可伸缩扩展的事件服务

这是来自OpenCredo使用Cassandra存储事件的经验分享PDF

所谓事件服务实际是提供事件存储和查询的微服务。之所以需要事件服务,原因如下:
1.捕获成千上百的平台事件和业务事件
2.异步触发下游处理
3.以不平常方式定制标准处理方式
4.提供系统领域内的事务日志
5.分析
6.系统测试

设计原则是简单、解耦、可扩展和容错。

起初Event服务的API版本1设计为存储和读取一个事件。
POST /api/events/
GET /api/events/{eventId}

一个事件Event的样本数据:


{
"type" : "DEMOENTITY.DEMOPROCESS.DEMOTASK",
"source" : "demoapp1:2.5:981a24b3-2860-40ba-90d4-c47ef1a70abe",
"clientTimestamp" : 1401895567594,
"serverTimestamp" : 1401895568616,
"platformContext" : {
"id" : "demoapp1",
"version" : "2.5"
},
"businessContext" : {
"channel" : "WEB",
},
"payload" : {
"message" : "foo",
"anInteger" : 33,
"bool" : false
}
}

Event事件的Cassandra数据表设计:


Event服务API 版本2是查询多个事件和通知
GET /api/events?{queryString}
{queryString}由下面字段组成:start, end, startOffset, limit, tag, type,order

举例:
GET /api/events?start={startTime}&end={endTime}
GET /api/events?startOffset=3600000&type=someType

如何对时间序列Time series建模呢?
使用时间戳作为集群列。


好处是:简单,对简单数据结构很适合,好的读写性能。
缺点是:分区大小的限制(2 billion cells),灵活性差 查询限制。

使用Time bucket:


特点:查询变得稍微更复杂,写性能不影响,读取(较)慢。

原文还提供查询和分页查询模型的设计:PDF

[该贴被banq于2014-12-08 16:05修改过]