0

我们有一个单一的关系数据库表来累积客户的订单。订单具有不同的类型和参数以及它们的生命周期(例如新建、修改、更新、取消等)。

要求:

  1. 一天之内就有大约300万份订单进来。
  2. 峰值速度是每秒 400 个新订单 - 这是一个很高的插入率。
  3. 不断增长的数据库目前有 1 亿个订单。当然,它们可以被查询和聚合。
  4. 全球数以百计的消费应用程序需要:
    • 通过数据库中的过滤器获取日期/时间范围内的一组订单。
    • 通过过滤器订阅/连续收听订单的传入更新。(过滤器是订单应该满足的一组条件,因为每个应用程序都对一组特定的数据感兴趣)。

我们需要一个满足上述所有要求的服务器端应用程序。

问题:

  1. 我们无法达到 1 号的实时要求(每个订单的延迟 <100 毫秒)。由于 RDBMS 中频繁的表插入/更新和可变的选择语句、查询聚合等,SQL 查询非常慢。
  2. 我们目前也没有灵活的订阅过滤器。
  3. 当前的解决方案不可扩展。RDBMS 是主要瓶颈。

我会很感激听到建筑和技术的想法。谢谢你。

4

2 回答 2

3

分布式缓存

Hazelcast是一种分布式缓存实现,是 Oracle Coherence 的免费开源替代方案,它还支持 Write-behind 和 Continuous Query 机制,结合起来可以解决您的三个问题。

  1. 使用 write-behind 通过缓存进行异步数据库写入。
  2. 使用连续查询来接收每个缓存放置操作的实时更新。
  3. Hazelcast 是分布式的,启动集群非常容易。使用 write-behind,您的可扩展性受到 hazelcast 节点数量和可用内存量的限制。

消息传递

消息中间件是另一种可用于解决您的问题的选项。

  1. 利用异步队列/主题来卸载数据库。队列/主题将以灵活的方式进行逻辑分区,以便能够调整数据库上的负载。这将需要在消息传递和数据库之间开发一个单独的层。
  2. 同样,使用主题订阅传入订单以创建连续查询的效果(消费订单并将其持久化到数据库的层将负责发送更新)。
  3. 许多消息代理实现还支持集群/分布式以实现额外的并行化和可扩展性(例如,HornetQ)。

请注意,通过消息传递,您可以同时拥有高可用性、可靠性和可伸缩性。

数据库级别

假设您使用 Oracle 作为数据库,对于您的问题 1-3,您至少有以下选项:

  1. 按地区/日期范围/客户名称/其他类别对表格进行分区——无论适合您的特定情况——将为您提供一些扩展读/写的空间。如果您有大量可供 Oracle 使用的 CPU 内核,则适当的分区可能会利用并行化水平显着提高对大型数据集的查询性能(在一个项目中,我们将处理大型数据集的时间从 5 小时缩短到 10 分钟)。
  2. 结合 Oracle Advanced Queuing 的 INSERT 触发器可用于实现连续查询(尽管在某些情况下,外部消息传递代理可能会更好地工作)。
  3. 见#1。

事实上,您可以考虑将上述方法组合起来,以针对您的特定情况实现最佳性能和可伸缩性。

我没有考虑迁移到 NoSQL 数据存储,因为 IMO,NoSQL 解决方案并不是最适合数据一致性至关重要的应用程序,我认为这是您的情况。

于 2014-02-13T16:28:00.263 回答
2

也许 CQRS 设计模式适合这种情况
,请参阅此处,Martin Fowler 的文章

这个想法是分开选择和插入/更新命令

于 2013-09-27T21:06:50.873 回答