go语言消息通讯 golang 消息( 三 )


01
golang 中使用 streadway/amqp 时,需要保证每一个线程单独一个 Channel 。
【go语言消息通讯 golang 消息】streadway/amqp 库中的获取一个 Channel 的方法「Connection.channel()」是线程安全的 。但是内部有一个 defaultChannelMax 的参数对 Channel 的数量进行了限制,默认是 (210) - 1 , 2047 。这个需要注意:
?
02
我们可以通过调用 amqp.DialConfig(url string, config Config) 来调整个限制 。
?
但是 , 并不是你调整了多少就是多少 , 还需要和 RabbitMQ 服务端的配置进行 min() 函数的处理,最终为两者的最小值 。
Tips:特别是用云厂商的 MQ 产品,因为阶梯收费的原因会对很多性能参数做限制,需要格外关注这点,比如某版本的阿里云 RabbitMQ 实例限制是单个 Connection 最多 64 个 Channel)
03
正如前面对 Erlang 的简单介绍,Erlang 是一个天然支持多“进程”设计的语言 , 所以在 RabbitMQ 的服务端设计中,每一个 Queue,每一个 Connection 都是单独的一个“进程” 。因此如果你想尽可能地压榨 RabbitMQ 性能,可以通过建立更多的 Connection 或者创建更多的 Queue 来实现,当然需要注意到 Connection 的创建和销毁的性能开销问题 。
推荐阅读:
减少联调、高效集成,试试这个工具
golang使用3周总结
也可以「关注」我,带你以技术思维看世界~
想更进一步和我一起玩耍 , 欢迎「搜索微信公号:跨界架构师」 。
内容包括:架构设计丨分布式系统丨产品丨运营丨个人深度思考 。
Go CSP并发模型Go的CSP并发模型
Go实现了两种并发形式 。第一种是大家普遍认知的:多线程共享内存 。其实就是Java或者C++等语言中的多线程开发 。另外一种是Go语言特有的 , 也是Go语言推荐的:CSP(communicating sequential processes)并发模型 。
CSP 是 Communicating Sequential Process 的简称 , 中文可以叫做通信顺序进程,是一种并发编程模型,由 Tony Hoare 于 1977 年提出 。简单来说 , CSP 模型由并发执行的实体(线程或者进程)所组成,实体之间通过发送消息进行通信,这里发送消息时使用的就是通道,或者叫 channel 。CSP 模型的关键是关注 channel,而不关注发送消息的实体 。Go 语言实现了 CSP 部分理论。
“不要以共享内存的方式来通信,相反,要通过通信来共享内存 。”
Go的CSP并发模型,是通过goroutine和channel来实现的 。
goroutine 是Go语言中并发的执行单位 。其实就是协程 。
channel是Go语言中各个并发结构体(goroutine)之前的通信机制 。通俗的讲,就是各个goroutine之间通信的”管道“ , 有点类似于Linux中的管道 。
Channel
Goroutine
go语言能做什么?很多朋友可能知道Go语言的优势在哪go语言消息通讯,却不知道Go语言适合用于哪些地方 。
1、 Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式系统、数据库代理等go语言消息通讯;网络编程方面 。Go语言广泛应用于Web应用、API应用、下载应用等;除此之外,Go语言还可用于内存数据库和云平台领域,目前国外很多云平台都是采用Go开发 。
2、 其实Go语言主要用作服务器端开发 。其定位是用来开发"大型软件"的 , 适合于很多程序员一起开发大型软件,并且开发周期长,支持云计算的网络服务 。Go语言能够让程序员快速开发,并且在软件不断的增长过程中,它能让程序员更容易地进行维护和修改 。它融合go语言消息通讯了传统编译型语言的高效性和脚本语言的易用性和富于表达性 。

推荐阅读