首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生产者消费者在高丽-并发与平行?

生产者消费者在高丽-并发与平行?
EN

Stack Overflow用户
提问于 2015-12-13 16:14:30
回答 2查看 1.1K关注 0票数 2

我正在研究纯在Golang的后端架构。我有一个API,用于将文件上传到golang服务器,然后将文件传输到云存储(从golang服务器本身)。现在,我希望这两个传输都是独立的,这样,最终用户就不必在上传文件后等待响应。

代码语言:javascript
复制
End User -> Golang Server ->[Concurrency/Parallelism] -> Cloud Storage

现在,我想到了两种方法:

  1. 一旦用户完成上传并将文件传输到云,就创建一个goroutine。
  2. 将文件处理程序插入队列中,另一个进程将读取该队列并将文件传输到云存储(多个生产者-单一消费者模型)。

我发现了使用goroutine和频道的例子,但我认为这会产生同样多的goroutine有上传。我想使用第二种选择,但无法理解如何在金刚进行呢?

另外,如果我使用了错误的方法,还有其他一些有效的方法。

更新

关于需求和约束的详细信息:

  1. 我正在使用AWS S3作为云存储。如果在某个时候,从Go服务器到Amazon的上传失败了,那么文件处理程序应该保持原样,以保存失败上传的记录。(我没有对此进行优先级排序,我可能会根据客户的反馈来更改这一点)
  2. 一旦上传成功完成到亚马逊S3,该文件将从Go服务器中删除,以避免重复上传。另外,如果一个文件以相同的名称上传,它将在Amazon上被替换。
  3. 正如注释中指出的,我可以使用通道作为队列。是否有可能使用Go的通道和goroutines来设计上述体系结构?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-14 02:58:42

上传文件的用户可以容忍错误,然后再试一次。但是,如果上传的文件只存在于上传到的机器上,并且在上传到云存储之前出现问题,则存在危险。在这种情况下,该文件将丢失,这将是一个令人沮丧的用户。

好的建筑解决了这个问题。这是一个先入先出队列模式

这种模式最受欢迎的Go实现是上班族,也许是由Redis数据库支持的。

假设有n数量的服务器在任何给定时间运行您的服务。假设后端代码编译了两个独立的二进制文件,一个是服务器二进制文件,另一个是工作者二进制文件。

理想情况下,接受文件上载的机器都会挂载一个共享的网络文件系统,以便:

  1. 用户将文件上载到服务器服务器向工作队列中添加一个记录,其中包含来自Redis存储的唯一ID。 b.这个唯一的ID用于创建文件名,该文件直接从用户上传到NFS服务器上的临时存储。请注意,该文件从未驻留在运行服务器的机器的存储上。
  2. 文件由worker上传到云存储中。 a. worker从工作队列中获取下一个待办事项记录,该记录具有唯一的ID。 使用唯一的ID查找NFS服务器上的文件,worker将文件上载到云存储中。 成功后,worker更新工作队列中的记录以反映成功。 d. worker删除NFS服务器上的文件。

通过将服务器流量和工作队列大小作为两个独立的度量来监视,可以确定应该分别运行服务器/工作人员服务的服务器数量。

票数 2
EN

Stack Overflow用户

发布于 2015-12-14 06:35:21

Marcio Castilho写了一篇关于类似问题的好文章。它可以在使用golang每分钟处理100万次请求找到。

他展示了他所犯的错误,以及他为纠正这些错误而采取的步骤。很好的来源,学习渠道的使用,大杂烩和一般并发。

上班族查内卡耶中也是很好的来源。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34253215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档