2016-05-14 65 views
1

我正在使用phoenix框架构建应用程序,该框架将使用数千个频道,用户将每隔一秒钟发送长时间,拉秒信息的消息。频道上的持续消息

所以,我会每秒钟收到数千条消息。

问题是,如何将每条消息存入数据库? 请多多包涵来形容这个我的想法,因为我想到下列选项来处理信息存储到DB:

  1. 使用相同的连接过程中对信息存储到数据库中。

    可能的警告: 这会影响通道的等待时间和性能吗?

  2. 为每个通道创建一个DB专用进程来存储其消息。

    可能需要注意的事项: 然后,如果我有100'000个通道,我需要另一个100'000进程来存储消息,这样好吗?考虑到erlang过程是精简而便宜的?

  3. 为所有通道创建一个数据库进程,然后来自任何通道的每条消息都将排队,然后由此个人数据库进程存储。

    可能需要注意的事项: 一个存储数千个通道的所有消息的过程,消息队列会变高,会慢吗?

所以,这是存储信息来每秒从数以千计的通道建议的方法?

编辑

我会用dynamo db这将扩展到处理数千个容易并发请求的。

+0

首先,Phoenix默认为您提供db进程池。其次,每个用户已经有一个进程,所以延迟不应该受到影响。 – tkowal

回答

2

最重要的问题是连接通道中的请求是否可以在写入数据库之前完成。您需要考虑如果连接过程回应客户端以及数据库发生了什么情况以便写入数据库会发生什么情况。如果数据丢失是可接受的,则DB访问可以异步完成,如果不是,则它需要是同步的,例如,只有在数据库确认已存储请求后才回应客户端。

如果数据可以异步存储到数据库,那么最好是产生一个新进程来完成它或将其添加到队列(2和3)。如果数据必须同步存储,那么在相同的过程(1)中更容易处理它。请注意,如果在不同的进程中处理数据库写入并且消息大小很大,则可能会影响性能的进程之间复制请求。

可以提高异步写入的可靠性,例如通过在将请求写入数据库之前将其永久存储在某个位置,然后回复给客户端,然后尝试完成数据库写入操作,然后重新尝试如果数据库关闭。但这会让这一点复杂化。

您还需要确定瓶颈,体系结构的最慢部分是什么。如果数据库那么是否创建一个请求队列到数据库并不重要,或者如果您为每个连接创建一个新进程,请求将堆积在单个进程的内存中或创建的进程的数量。

我可能会确定数据库可以处理多少个并行连接而不会牺牲延迟太多并创建一个处理请求的进程池。然后,我会创建一个队列来将请求分发给这些池化进程。为了处理更大的消息,我会从队列中获取令牌(写入权限)并直接连接到数据库以避免复制消息太多。如果稍后发现任何瓶颈,则该体系结构将更容易扩展,例如,在数据写入数据库之前持久地存储传入的消息,或在数据库过载时平衡对其他节点的请求。

+0

请看我的编辑,然后你的想法是什么? – simo

+0

您仍然需要回答最重要的问题,只有在数据库写入后才回应客户端,或者您可以立即回复并写入,否则可能会导致数据不会写入最终版本网络或其他问题。 – Amiramix

+0

用户不应该等待数据库来写消息,但是如何写出所有消息是很重要的。 – simo