zeromq源码框架解析

基础组件

i_poll_events

事件接口,处理网络读写事件以及定时器事件

«interface»
i_poll_events
+void in_event()
+void out_event()
+void timer_event(int id_)

i_pipe_events

管道事件

«interface»
i_pipe_events
+void read_activated(pipe_t *pipe_)
+void write_activated(pipe_t *pipe_)
+void hiccuped(pipe_t *pipe_)
+void pipe_terminated(pipe_t *pipe_)

read_activated:激活读操作
write_activated:激活写操作
hiccuped:暂时停顿,通过从session到socket_base
pipe_terminated :管道结束

io_object_t

可以获取io_thread_t的poller,用于监听句柄的读写以及异常状态

io_object_t
- poller_t* _poller
+void plug(io_thread_t *io_thread_)
+unplug()
i_poll_events

plug方法是获取io_thread的poll
unplug是将poll设置为NULL

poller_t

是不同平台事件驱动的别名,如epoll_t,select_t, pollset_t,poll_t,kqueue_t以及devpoll_t。以epoll_t为例。
其类层次结构为

poller_base_t
- timers_t _timers
- atomic_counter_t _load
- clock_t _clock
+void add_timer(int timeout_, i_poll_events *sink_, int id_)
+void cancel_timer(i_poll_events *sink_, int id_)
worker_poller_base_t
- const thread_ctx_t &_ctx
- thread_t _worker
+void loop()
epoll_t

poller_base_t:主要是管理定时器相关的操作
worker_poller_base_t:单线程poller的基类

object_t

用于线程间的命令发送和接收处理的模板基类
process_command:用于处理命令的模板方法,根据命令类型调用对应的命令处理函数process_xxx。
send_xxx:用于发送命令,最终会调用send_command

own_t

_owner:表示拥有此对象的socket_base_t
_owned:表示socket_base_t拥有的所有对象,socket_base_t也继承了own_t
其中处理命令term_req和term,用于在_owned中的动态分配的对象的释放

own_t
own_t *_owner
owned_t _owned
object_t

mailbox

mailbox的事件是io_thread,用于线程间通过管道来通信

«interface»
i_mailbox
void send(const command_t &cmd_)
int recv(command_t *cmd_, int timeout_)
mailbox_t
mailbox_safe_t

ypipe_base_t

用于线程间通信

«interface»
ypipe_base_t<T>
void write(const T &value_, bool incomplete_)
bool unwrite(T *value_)
bool flush()
bool check_read()
bool read(T *value_)
bool probe(bool (*fn_)
ypipe_conflate_t<T>
ypipe_t<T>

i_engine

io线程内用于读写网络数据

«interface»
i_engine
bool has_handshake_stage()
void plug(io_thread_t *io_thread_, session_base_t *session_)
void terminate()
bool restart_input()
void restart_output()
void zap_msg_available()
const endpoint_uri_pair_t &get_endpoint()
«interface»
i_encoder
«interface»
i_decoder
stream_engine_base_t
udp_engine_t
ws_engine_t
wss_engine_t
zmtp_engine_t
raw_engine_t
norm_engine_t
pgm_receiver_t
pgm_sender_t

stream_engine_base_t:用于socket_stream,如tcp和unix socket的基类
udp_engine_t:用于udp
ws_engine_t/wss_engine_t:用于web socket
zmtp_engine_t:用于处理协议zmtp
raw_engine_t:没有handshake
norm_engine_t:用于NACK-Oriented Reliable Multicast (NORM)传输协议
pgm_receiver_t:用于PGM套接字接收端
pgm_sender_t:用于PGM套接字发送端

i_encoder/i_decoder

用于数据的编解码

«interface»
i_encoder
size_t encode(unsigned char **data_, size_t size_)
void load_msg(msg_t *msg_)
«interface»
i_decoder
void get_buffer(unsigned char **data_, size_t *size_)
void resize_buffer(size_t)
int decode(const unsigned char *data_, size_t size_, size_t &processed_)
msg_t *msg()
encoder_base_t<T>
-msg_t *_in_progress
-unsigned char *const _buf
-const size_t _buf_size
-bool _new_msg_flag
-step_t _next
-size_t _to_write
-unsigned char *_write_pos
+void next_step(void *write_pos_, size_t to_write_, step_t next_, bool new_msg_flag_)
raw_encoder_t
v1_encoder_t
v2_encoder_t
v3_1_encoder_t
ws_encoder_t
decoder_base_t<T>
raw_decoder_t
v2_decoder_t
ws_decoder_t
v1_decoder_t

encoder_base_t:给编码提供了一个处理框架 ,通过实现了填充输出缓冲区的状态机。_in_progress表示正在处理的消息数据
_buf编码时用于存储编码后的数据,在encode传的参数*data_为NULL时,会使用_buf
_buf_size用于指定_buf缓存的大小
_new_msg_flag标识是否是新消息
_next下一步的状态机
_to_write下一步状态机执行前需要写的数据剩余大小
_write_pos表示数据源
next_step用于设置下一步状态机的数据源,数据大小,以及是否是新消息

session_base_t

管理zmq_socket的连接和通信,主要与engine进行交换数据

session_base_t
own_t
io_object_t
«interface»
i_pipe_events
req_session_t
radio_session_t
dish_session_t
hello_msg_session_t

socket_base_t

zeromq的socket,在zmq中,被当成一种特殊的”线程“,具有收发命令的功能

own_t
array_item_t
«interface»
i_poll_events
«interface»
i_pipe_events
socket_base_t
pair_t
xpub_t
pub_t
xsub_t
sub_t
dealer_t
req_t
routing_socket_base_t
router_t
rep_t
pull_t
push_t
stream_t
server_t
client_t
radio_t
dish_t
gather_t
scatter_t
dgram_t
peer_t
channel_t

engine的处理过程

以stream_engine_base_t为例,其构建了处理tcp发送和接收数据处理的框架
其中编解码器以及_process_msg由子类来指定

接收数据处理

stream_engine_base_t i_decoder session_base_t in_event in_event_internal get_buffer read resize_buffer opt [_insize = 0] decode msg _process_msg loop [_insize > 0] flush stream_engine_base_t i_decoder session_base_t

发送数据处理

stream_engine_base_t i_encoder out_event encode _next_msg load_msg encode loop [_outsize < out_batch_size] opt [_outsize = 0] write stream_engine_base_t i_encoder

编码处理

在编码过程中,如果需要写入的数据大小为0,则进入下一阶段,即_next

encoder_base_t encode _next opt [_to_write = 0] loop [pos < buffersize] encoder_base_t

解码处理

如果解码时数据开始位置为data,则调用_next直到读完

decoder_base_t decode next loop [_to_read = 0] opt [data_ = _read_pos] next loop [_to_read = 0] loop [bytes_use- d_ < size_] decoder_base_t

组件关系

在这里插入图片描述

tcp发起连接

User ctx_t reaper_t io_thread_t socket_base_t session_base_t tcp_connecter_t stream_engine_base_t zmq_ctx_new new return ctx zmq_socket create_socket new start new start new return socket_base return socket_base zmq_connect connect create return session launch_child(session) send_plug(session) process_plug new return tcp_connecter_t launch_child(connecter) send_plug(connecter) process_plug start_connecting add_fd out_event new return engine send_attach (_session, engine) process_attach plug add_fd(fd) send_term_req(session, tcp_connector) process_term_req send_term(tcp_connector) process_term User ctx_t reaper_t io_thread_t socket_base_t session_base_t tcp_connecter_t stream_engine_base_t

session和socket_base管道建立

session_base_t zmq pipe_t io_thread_t socket_base_t socket_base_t子类 engine_ready pipepair new创建pipe0 返回pipe0 new创建pipe1 返回pipe1 set_peer设置pipe0的对端为pipe1 set_peer设置pipe1的对端为pipe0 return 0 set_event_sink(session) send_bind(socket_base, pipe1) process_bind attach_pipe set_event_sink(socket_base) xattach_pipe session_base_t zmq pipe_t io_thread_t socket_base_t socket_base_t子类

session和socket_base管道通知读写

通知读

User socket_base_t socket_base_t子类 pipe_t io_thread_t session_base_t i_engine_t send xsend write flush send_activate_read(session对应的pipe) process_command process_activate_read,其中pipe_t为session对应的pipe read_activated restart_output User socket_base_t socket_base_t子类 pipe_t io_thread_t session_base_t i_engine_t

通知写

User socket_base_t socket_base_t子类 pipe_t io_thread_t session_base_t i_engine_t recv xrecv read send_activate_write(session对应的pipe) process_command process_activate_write,其中pipe_t为session对应的pipe write_activated restart_input User socket_base_t socket_base_t子类 pipe_t io_thread_t session_base_t i_engine_t
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值