akka 或类似的 golang 替代方案来支持分布式并发?

Posted

技术标签:

【中文标题】akka 或类似的 golang 替代方案来支持分布式并发?【英文标题】:akka or similar alternative for golang to support distributed concurrency? 【发布时间】:2014-02-24 23:30:09 【问题描述】:

我知道 golang 的内置支持非常擅长并发,但在我看来它们不是分布式的,所以框架/库允许我们在分布式环境中编写生产者/消费者应用程序。

【问题讨论】:

【参考方案1】:

如果您想在分布式程序中使用 Go 的通道概念,不妨查看 Go Circuit 框架。

它为运行多进程程序(可能分布在多台机器上)提供了一个框架,允许您使用通道在这些进程之间进行通信。

【讨论】:

这比尝试在 Go 中采用 Akka 更好。 Akka 的并发模型基于 Erlang 的 Actor 模型,它(仅)通过将消息放入目标 Actor 的单个输入队列来操作。不可能编写数据驱动的同步结构。相反,在 Go 中,基本的通道模型是同步/阻塞消息传递。当发送者和接收者要解耦时,很容易缓冲这个。 Go 充分利用了这两种方法,并且比 Akka 模型更通用。 嗨,您能详细解释一下 Akka 并发模型与 Go 的基于通道的方法的优缺点吗?或者我可以找到这些信息的任何来源? @Rick-777 - 您能否详细说明 Akka 中无法使用数据驱动的同步结构?在 Akka 中,您可以进行同步,尽管我们的想法是您尝试尽可能少地进行同步。 很简单,Akka 是一个受限的、受限的并发模型。它非常很好地实现了某些事情;尤其是具有容错能力的分布式计算是它的强项。然而,CSP从根本上是一种更通用的并发模型。使用 CSP,您可以根据需要做 Akka 所做的事情。但你不必这样做。使用 Akka,您将绑定到回调模型 - Akka 的参与者提供了一个很好的回调封装来处理消息接收;但仅此而已。你如何在机器人技术中进行锁步数据驱动的流量控制? Akka 不能,但 CSP 可以。【参考方案2】:

这里不需要重新发明***...生产者/消费者应用程序通常使用消息队列构建。

使用这种方法,您应该尝试将问题分解为小的(理想情况下是幂等的)任务,构建一个可以将这些任务排入队列的应用程序,然后让另一个工作应用程序可以将这些任务出列并执行它们。扩展很容易:只需添加更多工作人员。

那里有很多排队解决方案,对于用 Go 编写的非常好的解决方案,请查看 NSQ。

【讨论】:

或者让你自己免于头疼,使用本应以这种方式使用的 Erlang 或 Elixir,并为您提供更多功能,包括监督。 Go 也被设计用于开发分布式系统。分布式系统开发并不容易,没有任何框架能让它变得容易。 Erlang 不是一个“框架”。它是一种功能完备的编程语言,擅长分布式计算。 Elixir 是该语言的一种更现代的变体。如果您的用例是多节点分布式计算,两者都远优于 Golang。 Golang only 在单个盒子上的并发性很强。对于跨越机器边界,使用 Golang 并不比使用 C 更好。【参考方案3】:

晚了两年,但如果其他人正在寻找的话。 https://github.com/AsynkronIT/gam

GAM(Go Actor Model)既支持 Akka 之类的演员,也支持 Ms Orleans 之类的 Virtual Grains。 通过 Protobuf 代码生成支持像 Virtual Grains 这样的 Ms Orleans 为您提供键入的消息和键入的粒度类型。 看 https://github.com/AsynkronIT/gam/blob/dev/examples/cluster/member/main.go https://github.com/AsynkronIT/gam/blob/dev/examples/cluster/shared/protos.proto

它也非常快,每秒 100 万条以上的远程消息。

【讨论】:

【参考方案4】:

Akka 基于 Actor 模型。为此,我邀请您测试一个不错的 Go 框架:https://github.com/AsynkronIT/protoactor-go

据说性能很好,因为它声称在节点之间传递:

每秒 200 万条消息

虽然 Go 已经使用 CSP 实现,但 Protoactor 补充说:

解耦并发 默认分发 容错

【讨论】:

【参考方案5】:

仅作记录NATS 是分布式系统的高性能解决方案。它是开源的,在MIT 许可下。 “核心 NATS 服务器充当构建分布式应用程序的中枢神经系统。”它有官方的clients 用于 Go、C#、Java、Ruby、Python、Node.js 以及社区提供的更多内容。

【讨论】:

以上是关于akka 或类似的 golang 替代方案来支持分布式并发?的主要内容,如果未能解决你的问题,请参考以下文章

数据中心的 Amazon S3 替代方案?

golang Go中所有(...)的Python实现的替代方案

Paypal(或替代方案)向陌生人付款?

golang 中的 pubsub 替代方案

mongodb的简介

Go中函数重载的替代方案?