我正在研究一个用例,我需要不断收集和处理智能手机上正在进行的用户会话的信息。智能手机应用程序与服务器联系,并在整个会话期间继续向服应用程序通常每15-20秒报告一次会话指标。典型的会话持续15-20分钟,但也可能长达1-2小时。会话指标必须在仪表板上可用,该仪表板不仅可以为正在进行的会话提取指标,还可以提取历史会话(最近30天)
我使用Spark Streaming和MapWithState功能来管理会话状态。每次火花批次后,我都会不断将更新的状态信息推送到外部数据库。目前,仪表板仅查询外部数据库。
我担心这样一个系统的性能,因为当系统负载很重时,数据库upserts变得太多了。必须在仪表板上提供最新的会话信息(严格的业务要求)。
我可以做些什么改进? Spark有一个JDBC服务器的概念。我可以以某种方式使用它吗?如果是,我将不得不在数据库(用于历史会话)和Spark(用于正在进行/最近的会话)之间进行操作。
仅供参考:我不能使用Spark Structured流,因为在我的情况下,状态管理非常复杂。