1

我打算将来自商业网站的大批量订单交易记录存储到存储库(这里必须使用 cassandra,这是我们的数据库)。让我们将此组件称为commerceOrderRecorderService。

问题的第二部分是 - 我想处理这些订单并推送到其他下游系统。这个组件可以称为batchCommerceOrderProcessor。

commerceOrderRecorderService 和 batchCommerceOrderProcessor 都将在 Java 平台上运行。

我需要对这些组件的设计提出建议。特别是下面的:

commerceOrderRecorderService

  1. 考虑到性能和可扩展性,他设计色谱柱的最佳方式是什么?我是否应该将整个订单(复杂实体)存储为单个 JSON 对象。订单属性没有搜索要求。我们至少可以等到它们被批处理器处理。考虑 - 单个订单可以包含许多子项目 - 在处理时,每个子项目都可以以不同方式完成。为这种数据结构设计列可能是一种矫枉过正

  2. 什么应该是关键,因为数据量会很高。假设在高峰期每秒进行 10 次交易。在 cassandra 中创建此类事务数据的任何库或最佳实践?TTL也能有效使用吗?

batchCommerceOrderProcessor

  1. 应该如何检索行进行处理?
  2. 如何确保批处理器的多线程实现(也可能在多个节点上运行)将具有行级隔离。也就是说,没有两个实例会同时读取和处理同一行。没有重复处理。
  3. 如何在一段时间后清除数据,同时对压缩等 cassandra 进程友好。

欣赏设计输入、代码示例和库指针。谢谢。

4

2 回答 2

2

根据系统的整体要求,采用由以下组成的架构是可行的:

  1. Cassandra来存储订单、分析和你拥有的东西。
  2. 消息队列- 您的商务订单记录器服务将简单地将新订单排入事务和持久队列并返回。可扩展性和性能在这里应该不是问题,因为您可以使用单个队列服务器轻松实现每秒数千个事务。您可以将 RabbitMQ 视为可用选择之一。
  3. 流处理框架- 您可以使用 Twitter Storm 等流框架以可扩展的方式从队列中读取消息流。你可以在 Java 中实现,而不是在 Storm 中实现 3 个简单的流水线流程:

    a) Spout 进程从队列中取出下一个订单并将其传递给第二个进程
    b) 称为 Bolt 的第二个进程将每个下一个订单插入 Cassandra 并将其传递给第三
    个 Bolt c) 第三个 Bolt 进程将订单推送到其他下游系统。

这种架构提供了高性能、可扩展性和近实时、低延迟的数据处理。考虑到 Cassandra 在高速数据写入方面非常强大,但在读取顺序记录列表方面并不那么强大。我们在 InnoQuant MOCA 平台中使用 Storm+Cassandra 组合,并根据硬件处理 25.000 tx/秒甚至更多。

最后,您应该考虑这样的架构是否对您的场景来说不是过度杀伤力。如今,您几乎可以使用任何单盒数据库轻松实现 10 tx/秒。

于 2014-01-19T13:37:50.113 回答
1

这个例子可能会有所帮助。它使用 jmxbulkloader 加载大量事务,然后将结果批处理到一定大小的文件中,以便在其他地方传输。它是多线程的,但在同一个进程中。

https://github.com/PatrickCallaghan/datastax-bulkloader-writer-example

希望能帮助到你。顺便说一句,它使用最新的 cassandra 2.0.5。

于 2014-02-18T16:29:59.077 回答