Genstage和轮询是推荐的模式吗



我正在elixir中开发我的第一个中型/大型应用程序,我正在努力熟悉elixir系统设计和架构中的常见模式。

目前,我正在尝试实现一个输入队列(目前使用erlang:queue实现(,通过和API公开,我希望让来自该队列的消费者执行一些处理和存储数据。

我使用代理创建了队列,并实现了一个genStage,用于查询队列中的元素,以及一个genStage使用者,用于执行我需要的所有处理。总之,像这样的

队列代理------->GenStage制作人------->GenStage消费者---->数据库

我的问题如下:

  1. 这种模式对长生不老药有效吗
  2. GenStage生产者在队列上执行的轮询是有效的模式吗?每当消费者请求新元素时,它都会询问
  3. 这种模式是否有任何性能影响,特别是队列代理中是否有任何可能的阻塞影响

经过一些评论和阅读文档后,我意识到GenStage是基于GenServer的,我有可能从GenStage外部管理内部状态。

在这之后,我重构了代码,现在我有了:queue作为GenStage状态的一部分,所以我不需要轮询GenStage之外的任何队列,而且我还可以使用handle_cast方法将元素添加到队列中。

现在,我让Queue作为GenStage生产者工作,并且我已经能够将我的数据库服务作为消费者连接起来

最新更新