如何与spark和nosql数据库一起设计实时计费系统

时间:2015-11-15 21:28:18

标签: apache-spark cassandra spark-streaming cdr nosql

我想设计一个

的系统
  • 将读取CDR(呼叫数据记录)文件并插入它们 进入一个nosql数据库。为了实现与Cassandra的火花流,因为nosql看起来很有希望,因为文件将继续发展
  • 能够通过对持续时间和被叫号码进行评级来计算实时价格,或者在数据的情况下仅计算千字节数,并存储当前可用于当前周期的可累计金额。我需要一个nosql,我将插入额定的cdrs并更新目前该cdr中该msisdn的当前billcycle的可累计金额。
  • 如果针对特定订阅更新费率计划,则对于当前的帐单周期,需要重新计算使用该价格计划的所有cdrs,并且需要计算所有客户的总金额

说明:

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

1 个答案:

答案 0 :(得分:2)

问题确实非常广泛 - 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,因为你不会期望超过一些计划。

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