Golang Go语言中的信箱模式是什么?

发布于 1周前 作者 caililin 来自 Go语言

Golang Go语言中的信箱模式是什么?

前几天在群里和大伙聊 IM 架构,有个朋友提出信箱模式是现在最流行也是最强悍的架构。 请问什么是信箱模式? 貌似搜不到,问他又说自己领悟。

24 回复

自己瞎掰的吧,最流行会搜不到?

更多关于Golang Go语言中的信箱模式是什么?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Erlang 的并发模型?

我搜了好久,全是信箱相关的东西。所以我自己想了一套架构
ETCD 服务注册于发现,集群之间启动之时通过 ETCD 注册。
集群之间相互通过 TCP 连接

利益相关,我不能说太多,如果真有心的话你可以看看国外最近的那个 cs 论文,找不到的话说明你不适合这个行业。信箱模式有多强,行内人都知道,而且大厂内部早就已经用了很多年了,不然某些 im 怎么能扛那么大的用户量?你自己好好想想,为什么偏偏叫信箱模式,不叫 xx 模式?其实原理就在这个词中,回去好好领悟一下就明白了,懂与不懂只隔一层纸。好了我就说这么多,不然同行要打死我,毕竟都是靠这个吃饭的,拜师的话可以私聊,我很忙,有拜师门槛,你自己想清楚了可以来找我


以上纯属扯淡,包括什么需要自己领悟的信箱模式

去看 erlang 或者 zeromq

就是把原有的读扩散改成写扩散,IM 可以理解成实时性更强的邮箱

老哥,可以展开讲讲吗?写扩散,意思是发送消息的时候同时连接集群中所有的节点吗?

前几年有文章分析微信的协议,说 foxmail qqmail 是张小龙做的,微信消息协议是扩展的邮件的 sync 协议,难道指的是这里的信箱? google 微信协议 有几篇文章有详细介绍

我大概搜了一下读扩散和写扩散,感觉这个更加适合于群聊啊。我们当时聊的是 IM 集群,跨节点聊天。
比如我在 Server1 你在 Server2,咱俩聊天。我当时想做一个中间件分发,但是又怕中间件单机性能不够。想用 Zookeeper 又不了解,后来用了消息中间件相互订阅。
他推荐我信箱模式

actor model 吧

懂得都懂,听懂掌声👏

加了中间件分发就相当于做了一条总线嘛,用户量起来这条总线压力就太大了,小用户量没什么问题的

v2 也有谜语人了嘛

只知道读扩散和写扩散, timeline 模型. 这个信箱模式? 等一个答案

张小龙以前是做 QQ 邮箱的,现在你懂了吧

Actor 模型,信箱收消息干活

以 Actor 模型为线索,稍微搜索了一下资料做了一下理解,不知道对不对(或者究竟是否沾边):
其实所谓的“信箱”,归根到底,就是利用了一个“链”来存放消息,并且单步逐个消化“链”中的每一个消息。Actor 模型无非是有多个 Actor (例如处理信息的 Actor 若干个,组装信息的 Actor 若干个),每个 Actor 各自有自己的“信箱”并且根据信箱消息单步地干活。
不知道这样理解是否为正确,我反观一下有点类似于把一个“进程”微服务化。

听起来像是 actor model?
其实就是 CSP(Communicating Sequential Process)模型啊
对应的传统的模型是 share memory

看你的描述应该是 Actor 模型

在Golang(Go语言)中,信箱模式(Channel Pattern)是一种用于在goroutines(Go语言的并发体)之间进行通信和同步的机制。信箱,即Channel,是Go语言并发编程的一个核心概念,提供了一种安全的方式来传递数据。

信箱模式的核心思想是使用channel作为goroutines之间的通信桥梁。通过向channel发送(send)和接收(receive)数据,goroutines可以实现数据的交换和同步。这种机制避免了使用共享内存时的竞争条件(race conditions)和锁(locks)的复杂性。

在信箱模式中,一个goroutine可以向channel发送数据,而另一个goroutine可以从channel接收数据。这种通信是阻塞的,即发送操作会阻塞直到有接收者准备好接收数据,接收操作会阻塞直到有发送者发送数据。这种特性使得信箱模式非常适合于实现生产者-消费者模型、任务队列等并发模式。

此外,Go语言的channel还支持选择性接收(select语句),允许goroutine等待多个channel上的通信操作,从而提高了并发程序的灵活性和响应性。

总的来说,信箱模式是Go语言并发编程中的一种强大工具,通过提供安全、高效的goroutines间通信机制,简化了并发程序的设计和实现。在编写并发程序时,合理利用信箱模式可以显著提高程序的性能和可维护性。

回到顶部