我目前有一个处理大量事务的 MySQL 数据库。为简单起见,它是实时的动作数据流(点击和其他事件)。该结构是这样的,即用户属于子附属公司,而子附属公司属于附属公司。
我需要保持点击的平衡。为简单起见,假设我需要将每个用户、子关联公司和关联公司的点击余额增加 1(实际上取决于事件的处理更多)。目前我做的非常简单——一旦我收到事件,我会在 PHP 中进行顺序查询——我读取用户的余额,加一并存储新值,然后我读取子附属公司的余额,递增并写入, ETC。
用户的余额对我来说是最重要的指标,所以我希望尽可能保持实时。sub-aff 和会员级别的其他指标不太重要,但它们越接近实时越好,但我认为 5 分钟的延迟可能是可以的。
随着项目的发展,它已经成为一个瓶颈,我现在正在寻找替代方案——如何重新设计余额的计算。我想确保新设计每天能够处理 5000 万个事件。对我来说,不要丢失单个事件也很重要,我实际上将每个更改周期包装为在 sql 事务中单击余额。
我正在考虑的一些事情:
1 - 创建一个 cron 作业,它将不实时更新子附属公司和附属公司级别的余额,假设每 5 分钟一次。
2 - 使用存储过程将数字处理和余额更新移动到数据库本身。我正在考虑添加一个单独的数据库,也许 Postgress 会更适合这项工作?我试图看看是否有严重的性能改进,但互联网似乎在这个话题上存在分歧。
3 - 将这个特定的数据流移动到带有 parquet(或 Apache Kudu?)的 hadoop 之类的东西,如果需要,只需添加更多服务器。
4 - 对现有数据库进行分片,基本上为每个会员添加一个单独的数据库服务器。
对于此类任务,是否有一些最佳实践/技术或我可以做的一些明显的事情?非常感谢任何帮助!