数据处理与服务拆分策略探讨
1. 数据存储与处理的多元化需求
在数据处理过程中,我们可能会面临多种不同的数据存储和处理需求。例如,若应用数据更适合用图数据库(如 Neo4j)建模,或者更倾向于使用文档存储(如 MongoDB),又或者想为报告系统采用面向列的数据库(如 Cassandra)以更轻松地处理大规模数据,这些不同的需求可能无法通过单一数据库来满足。当信息存储在多个不同系统中时,我们需要考虑如何将这些数据整合起来进行报告,以及是否有办法消除标准报告数据库模型的一些缺点。
2. 数据检索方式
2.1 通过服务调用进行数据检索
这种模型有多种变体,核心是通过 API 调用从源系统拉取所需数据。对于简单的报告系统,如仅显示过去 15 分钟内订单数量的仪表盘,这种方式可能可行。但对于需要处理大量数据的用例,如分析音乐商店过去 24 个月的客户购买行为及其对收入的影响,这种方式会迅速失效。因为需要从多个系统拉取大量数据,而且本地存储副本可能导致数据不一致,为生成准确报告,需要获取过去两年的所有财务和客户记录,这会使操作变得非常缓慢。
此外,各微服务暴露的 API 可能并非为报告用例设计,例如客户服务可能只允许按 ID 查找客户或按字段搜索客户,而不提供检索所有客户的 API,这会导致大量调用以获取所有数据,既影响报告系统效率,也会给服务带来负载。虽然可以通过添加缓存头和使用反向代理缓存数据来加速数据检索,但报告通常需要访问长尾数据,可能导致缓存未命中。
为解决这些问题,可以暴露批量 API 来简化报告。例如,客户服务可以允许批量传递客户 ID 以批量检索客户,甚至可以提供分页接口。更极端的做法是将批量请求建模为独立