【发布时间】:2014-02-04 01:44:05
【问题描述】:
我打算将来自商业网站的大批量订单交易记录存储到存储库(这里必须使用 cassandra,即我们的数据库)。让我们将此组件称为 commerceOrderRecorderService。
问题的第二部分是 - 我想处理这些订单并推送到其他下游系统。这个组件可以称为batchCommerceOrderProcessor。
commerceOrderRecorderService 和 batchCommerceOrderProcessor 都将在 Java 平台上运行。
我需要有关这些组件设计的建议。特别是下面的:
commerceOrderRecorderService
考虑到性能和可扩展性,设计列的最佳方法是什么?我是否应该将整个订单(复杂实体)存储为单个 JSON 对象。订单属性没有搜索要求。我们至少可以等到它们被批处理器处理。考虑 - 单个订单可以包含许多子项目 - 在处理时,每个子项目都可以以不同的方式完成。为这种数据结构设计列可能有点过头了
什么应该是关键,因为数据量会很高。假设在高峰期每秒进行 10 次交易。在 cassandra 中创建此类事务数据的任何库或最佳实践? TTL也能有效使用吗?
batchCommerceOrderProcessor
- 应如何检索行进行处理?
- 如何确保批处理器的多线程实现(也可能在多个节点上运行)具有行级隔离。也就是说,没有两个实例会同时读取和处理同一行。没有重复处理。
- 如何在一段时间后清除数据,同时对压缩等 cassandra 进程友好。
欣赏设计输入、代码示例和库指针。谢谢。
【问题讨论】:
-
考虑到安装数据库服务器的容易程度以及数据库服务器 cassandra 的具体类型,我认为您选择 cassandra(“这是我们的数据库”)的动机是错误的。
-
@flup,如果你愿意,它就像一个设计约束,基于遗留。随意对您认为有意义的事情进行更多说明。我真的希望在给定的限制范围内输入。
-
我的意思是,不要仅仅因为你已经有了一个nosql数据库,而是因为你需要可扩展性。关于订单的问题:你能给出系统需要做什么的更功能性的描述吗?样品订单是什么样的?它去哪儿了?按照我现在阅读的方式,每个订单都被分解成订单行,这些订单行分布在不同的系统中。它是否正确?如果是这样,接下来会发生什么,系统是否有任何其他职责,例如将分布式线路的状态组合回订单状态?
-
订单将流向订单管理系统,在 RDBM 中持久化,等等。但是订单下游发生的事情与这个问题无关。就 commerceOrderRecorderService 而言,它只是可靠地持久化订单,在持久化之前检查重复的订单 ID。它甚至不关心订单项的组成、价值等。它与有效负载完全无关。
标签: locking cassandra batch-processing isolation