Golang Go语言中的信箱模式是什么?
Golang Go语言中的信箱模式是什么?
前几天在群里和大伙聊 IM 架构,有个朋友提出信箱模式是现在最流行也是最强悍的架构。 请问什么是信箱模式? 貌似搜不到,问他又说自己领悟。
Erlang 的并发模型?
我搜了好久,全是信箱相关的东西。所以我自己想了一套架构
ETCD 服务注册于发现,集群之间启动之时通过 ETCD 注册。
集群之间相互通过 TCP 连接
利益相关,我不能说太多,如果真有心的话你可以看看国外最近的那个 cs 论文,找不到的话说明你不适合这个行业。信箱模式有多强,行内人都知道,而且大厂内部早就已经用了很多年了,不然某些 im 怎么能扛那么大的用户量?你自己好好想想,为什么偏偏叫信箱模式,不叫 xx 模式?其实原理就在这个词中,回去好好领悟一下就明白了,懂与不懂只隔一层纸。好了我就说这么多,不然同行要打死我,毕竟都是靠这个吃饭的,拜师的话可以私聊,我很忙,有拜师门槛,你自己想清楚了可以来找我
以上纯属扯淡,包括什么需要自己领悟的信箱模式
去看 erlang 或者 zeromq
就是把原有的读扩散改成写扩散,IM 可以理解成实时性更强的邮箱
哭了
老哥,可以展开讲讲吗?写扩散,意思是发送消息的时候同时连接集群中所有的节点吗?
前几年有文章分析微信的协议,说 foxmail qqmail 是张小龙做的,微信消息协议是扩展的邮件的 sync 协议,难道指的是这里的信箱? google 微信协议 有几篇文章有详细介绍
我大概搜了一下读扩散和写扩散,感觉这个更加适合于群聊啊。我们当时聊的是 IM 集群,跨节点聊天。
比如我在 Server1 你在 Server2,咱俩聊天。我当时想做一个中间件分发,但是又怕中间件单机性能不够。想用 Zookeeper 又不了解,后来用了消息中间件相互订阅。
他推荐我信箱模式
actor https://github.com/AsynkronIT/protoactor-go 啥信箱模式啊?
actor model 吧
懂得都懂,听懂掌声👏
加了中间件分发就相当于做了一条总线嘛,用户量起来这条总线压力就太大了,小用户量没什么问题的
v2 也有谜语人了嘛
只知道读扩散和写扩散, timeline 模型. 这个信箱模式? 等一个答案
张小龙以前是做 QQ 邮箱的,现在你懂了吧
Actor 模型,信箱收消息干活
老懂王了
以 Actor 模型为线索,稍微搜索了一下资料做了一下理解,不知道对不对(或者究竟是否沾边):
其实所谓的“信箱”,归根到底,就是利用了一个“链”来存放消息,并且单步逐个消化“链”中的每一个消息。Actor 模型无非是有多个 Actor (例如处理信息的 Actor 若干个,组装信息的 Actor 若干个),每个 Actor 各自有自己的“信箱”并且根据信箱消息单步地干活。
不知道这样理解是否为正确,我反观一下有点类似于把一个“进程”微服务化。
听起来像是 actor model?
其实就是 CSP(Communicating Sequential Process)模型啊
对应的传统的模型是 share memory
在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间通信机制,简化了并发程序的设计和实现。在编写并发程序时,合理利用信箱模式可以显著提高程序的性能和可维护性。