我正在elixir中开发我的第一个中型/大型应用程序,我正在努力熟悉elixir系统设计和架构中的常见模式。
目前,我正在尝试实现一个输入队列(目前使用erlang:queue实现(,通过和API公开,我希望让来自该队列的消费者执行一些处理和存储数据。
我使用代理创建了队列,并实现了一个genStage,用于查询队列中的元素,以及一个genStage使用者,用于执行我需要的所有处理。总之,像这样的
队列代理------->GenStage制作人------->GenStage消费者---->数据库
我的问题如下:
- 这种模式对长生不老药有效吗
- GenStage生产者在队列上执行的轮询是有效的模式吗?每当消费者请求新元素时,它都会询问
- 这种模式是否有任何性能影响,特别是队列代理中是否有任何可能的阻塞影响
经过一些评论和阅读文档后,我意识到GenStage
是基于GenServer
的,我有可能从GenStage
外部管理内部状态。
在这之后,我重构了代码,现在我有了:queue
作为GenStage
状态的一部分,所以我不需要轮询GenStage
之外的任何队列,而且我还可以使用handle_cast
方法将元素添加到队列中。
现在,我让Queue作为GenStage
生产者工作,并且我已经能够将我的数据库服务作为消费者连接起来