Go源码学习: 关闭channel的内部实现是什么样的?
📅 2021-11-05
作为一个Gopher在刚开始学习channel的时候,一定见过以下关于关闭channel会发生什么情况
的总结:
- 关闭一个值为nil的channel将会panic
- 关闭一个已经关闭的channel将会panic
- 向一个已经关闭的channel发送数据会panic
本节将学习关闭channel,即close(ch)
的内部实现。关闭channel实际上调用的是runtime.closechan
这个函数。
作为一个Gopher在刚开始学习channel的时候,一定见过以下关于关闭channel会发生什么情况
的总结:
本节将学习关闭channel,即close(ch)
的内部实现。关闭channel实际上调用的是runtime.closechan
这个函数。
Pulsar支持可插拔的身份认证和授权机制,Pulsar Proxy或者Pulsar Broker都支持该机制。认证和授权机制一起保证了客户端对Pulsar Topic、命名空间、租户的访问权限。
默认情况下,Pulsar并不会启用加密、身份认证和授权机制。之前我们使用pulsar-admin
,pulsar-client
等命令行工具,使用Java或Go语言开发的Consumer和Produmer,访问使用docker容器启动的单机Pulsar时,都未用到任何身份认证信息。
也就是说,Pulsar的默认配置是完全开放状态的,任何人都可以访问它。因此,必须启用Pulsar的认证和授权机制,为Pulsar各个组件开启安全防护。
前面在学习Topic的时候,已经了解了分区Topic的基本概念。在Pulsar中一个Topic只能由一个Broker提供服务,而单个Topic的吞吐量受限于为其提供服务的Broker的计算能力,这限制了Topic的最大吞吐量。
Pulsar通过分区Topic来提高吞吐量
,分区Topic在底层通过N个内部Topic实现,N就是分区的数量。
本节将学习从channel中接收数据的内部实现。
在Go中从channel中接收数据有两种方式:
1v <- ch
2v, ok <- ch
使用v <- ch
从channel中接收数据时,会调用runtime.chanrecv1
,chanrecv1
调用了runtime.chanrecv
。
主流消息系统都会提供很多好用的特性支持各种业务场景,死信队列
, 延迟队列
这些词在使用这些消息系统时经常被提到。
Pulsar作为下一代云原生消息系统肯定也是支持这些特性的。Pulsar中没有队列的概念, 前面在学习使用Java和Go开发Pulsar的Consumer时,在创建Consumer时可以为其设置死信策略
,并指定死信Topic
。
本节将学习Pulsar中的延迟消息投递功能。
前面学习了channel的底层数据结构hchan以及hchan是如何被创建的。
使用类似ch <- 3
往channel中发送数据时,会调用runtime.chansend1
,chansend1
调用了chansend
,本节将主要学习runtime.chansend
这个函数。
channel是Go语言核心数据结构之一。Go提供了CSP(通信顺序进程Communicating sequential processes)的并发模型,关于Go并发的那句经典的谚语不要通过共享内存的方式进行通信,而是应该通过通信的方式共享内存
,goroutine之间的通信通过channel来完成。
本节将通过阅读源码(Go 1.17.2)了解Go语言中channel的数据结构,以及channel是如何被创建的。
前面学习了Pulsar的架构,在本地开发环境中使用Docker运行了单机的Pulsar,并学习使用plusar-admin
命令行工具管理集群、租户、命名空间和Topic,使用Java和Go开发Pulsar的Producer和Consumer,使用Pulsar Schema管理消息数据的类型安全。
本节将学习PulsarWeb图形管理工具Pulsar Manager,使用Pulsar Manager也可以监控和管理Pulsar集群、组合、命名空间和Topic。遵循渐进性学习原则,本节还是现在本地开发环境使用Docker容器运行Pulsar Manager,以后再完成在Kubernetes集群中部署生产就绪的Pulsar集群和Pulsar Manager。
在Linux系统中,一个程序进程在内存布局上遵循一定规律,进程的内存空间布局由高地址到低地址大致可分为以下几段:
ulimit -s
查看和调整,一般默认为8Mb,栈从高地址向低地址增长(函数调用)前面两节分别介绍了如何使用Pulsar Java客户端库和Go客户端库开发Producer、Consumer。 目前主流的消息中间件都不负责消息在从生产者到消费者上下游传递过程中的类型安全性,而由客户端自己负责消息的序列化和反序列操作来保障消息传递的类型安全。 Pulsar也支持这种客户端的方法,生产者将具体类型的消息对象序列化成字节数组发送到Topic,消费者从Topic接收字节数组并反序列化为具体类型的消息对象。 除了由客户端负责消息类型安全性的方法,Pulsar还提供了一种服务端的方法即Pulsar Schema,本节将学习如何使用Pulsar Schema管理消息数据的类型安全性。
...