envoy tls and rcu
在Service Mesh里,envoy目前是比较流行的,它实现了cloud design pattern里的很多模式,只要配置一下就可以,不用写代码。
在envoy的线程模型介绍里,讲到使用一个主线程和多个工作线程的模式。主线程管理cluster信息,而工作线程则管理连接和数据转发。对于全局的共享数据,比如集群信息,通过RCU机制传递给工作线程,避免加锁。
关于RCU的实现机制,Linux是在内核中实现的,比较复杂。但是envoy的实现就比较简单,主要有几点:
- 使用thread local的数据结构,这样线程之间就不会有竞争了。
- 使用带引用计数的shared_ptr来管理数据的生存周期,类似的把rcu_read_lock/rcu_read_unlock封装了。
- 在每个线程的消息循环处理时更新thread local数据,类似“classic RCU”实现。
Envoy的消息循环是基于Libevent来做的,同时为了使用的便利,对TLS做了复杂的封装。为了理解tls和rcu工作原理,我做了一个简单的实现,如下。