1

我想设计一个系统

  • 将读取 CDR(呼叫数据记录)文件并将它们插入到 nosql 数据库中。使用 Cassandra 实现这种火花流,因为 nosql 看起来很有希望,因为文件将不断涌现
  • 将能够通过评估持续时间和被叫数量或仅千字节(如果是数据)来计算实时价格,并存储当前账单周期迄今为止的总收费金额。我需要一个 nosql,我将同时插入额定 cdr 并更新该 cdr 中该 msisdn 的当前账单周期的总收费金额。
  • 如果针对特定订阅更新费率计划,则对于当前账单周期,需要重新计算使用该价格计划的所有 cdr,并且需要为所有客户计算迄今为止的总金额

笔记:

  • Msisdns 对于具有一对一关系的每个订阅都是唯一的。一个月内一个msisdn最多可以有100000个cdr。
  • 到目前为止,我一直在浏览 nosql 数据库,我正在考虑使用 cassandra,但我仍然不确定如何设计数据库来优化这个业务案例。
  • 还请考虑当一个 cdr 正在一个节点中处理时,同一 msisdn 的另一个 cdr 可以同时在另一个节点中处理,并且两个节点都执行上述逻辑。
4

1 回答 1

3

这个问题确实非常广泛 - StackOverflow 旨在涵盖更具体的技术问题,而不是讨论整个系统的架构方面。

除此之外,让我尝试解决您问题的一些方面:

a) 使用流式处理 CDR:

Spark Streaming 确实是传入 CDR 的首选工具,通常通过消息队列系统(如 Kafka)交付。它允许窗口化操作,当您需要计算设定时间段(小时、天等)内的通话费用时,它会派上用场。您可以非常轻松地将现有静态记录(例如来自其他数据库的价格计划)与您在窗口操作中传入的 CDR 结合起来。所有这些都在一个强大而广泛的 API 中。

b) 使用 Cassandra 作为存储

Cassandra 具有出色的扩展能力和即时行访问 - 为此,它是绝对的杀手。但是,在 TelCo 行业设置的情况下,我会严重质疑将其用于 MSISDN 查找和信用检查之外的任何其他用途。Cassandra 本质上是一个柱状 KV 存储,试图存储多维的、本质上是关系的记录,例如价格计划、合同和地块,会让你很头疼。我建议根据用例将您的数据存储在不同的商店中。这些可能是:

  • HDFS 中的 CDR 原始记录 -> CDR 可以很丰富,如果您需要重新处理它们,从 HDFS 收集它们会更有效
  • Cassandra 中的账单摘要 -> 逐项账单摘要是最初由 Spark Streaming 处理的 CDR 的结果。这些本质上是柱状的,可以完美地存储在 Cassandra 中
  • MSISDN 和信用信息 -> 如上所述,这也是 Cassandra 的完美用例
  • 价格计划 -> 这些是多维的,更面向文档,应该存储在支持这种结构的数据库中。您可以完美地使用带有 JSON 的 Postgres,因为您不会期望超过少数计划。

总而言之,您实际上是在查看一个经典的 lambda 用例,使用 Spark Streaming 立即处理传入的 CDR,并使用 HDFS 上的常规 Spark 进行批处理以进行后处理,例如,当您在计划更改后重新计算 CDR 成本时。

于 2015-11-15T22:59:22.057 回答