Alligator 系列:RabbitMQ 基础知识及部署
1. 概览
RabbitMQ 是一种消息系统,相比较其它消息系统,除了 queue,它多了一个
exchange 交换器的概念,在 Alligator 中支持使用 RabbitMQ,
其整体结构如下图所示:
RabbitMQ 是一种消息系统,相比较其它消息系统,除了 queue,它多了一个
exchange 交换器的概念,在 Alligator 中支持使用 RabbitMQ,
其整体结构如下图所示:
在操作系统中内存管理的基本单位是 page, page 大小一般是
4k。为了满足不同场景,分配不同大小的内存,操作系统提供了丰富的内存管理方法。从分层的角度来说,可以用下面的层次图来表示。
EventLoop 是 Reactor 模式中的执行者,首先它持有 Selector 对象,监听多路 SocketChannel 的网络 I/O 事件,并对 I/O 事件分发处理。同时,它持有一个 Thread 对象,除了监听网络 I/O 事件, EventLoop 也可以执行提交的任务,包括定时任务,总结来说,EventLoop 具有如下三大功能:
ChannelPipeline 可以理解为一个 ChannelHandler 列表,而 ChannelHandler 是一个能够独立处理 channel 入站 (inbound) 事件或出站 (outbound) 操作的处理器。ChannelPipeline 实现了 "Intercepting Filter" 模式,它给用户提供了事件处理及 ChannelHandler 之间交互的能力,用户可以根据业务场景定义 ChannelHandler,以类似插件的方式添加到 ChannelPipeline 中。
因 Netty 中大量使用异步的调用方式,启动流程中的代码在不同的线程中执行,给分析其启动的顺序带来了一定的麻烦。这篇文章主要是对 ServerBootstrap 服务器启动流程做一个整体性的讲述,分析了每一个步骤所承担的工作,以及前后步骤的触发关系,即前一个步骤怎么调用后一个步骤,仍然以服务器启动的代码为例,分析其流程。
Reactor
模式是一种服务器网络编程模式,它根据网络数据接收的特点,将连接的建立、网络数据的读写分离,用
mainReactor 线程处理网络的连接,用 subReactor
处理数据的读写,同时为了有效利用 CPU 多核的优势,subActor
可以有多个。它的整体结构如下图所示:
特点:
Netty 中所有的的 I/O 操作都是异步的。I/O 操作是比较耗时的,为了不阻塞调用线程,Netty 提供了 ChannelFuture 接口,使用 addListener()方法注册一个 ChannelFutureListener 监听器,可以在 I/O 操作结束之后进行通知返回结果。在下面的代码中,bind 操作返回一个 ChannelFuture 对象,可以继续执行后续操作,也可以调用 sync() 方法同步等待执行结果,给程序开发带来了更多的开发模式,结合不同的业务场景,可以方便选择异步还是同步模式。
在长连接系统中,客户端及服务器之间需要通过发送心跳包来感知对方的存活状态,一般来说,心跳包不承载业务信息,不过在一些场景中,会把当前服务的状态推送给对方。在 Alligator 系统中统一在客户端发送心跳包,服务器会检测当前连接的空闲时间(即多久未收到数据),若超过一定时间,则判定为连接断线。在客户端,会检测连接的空闲写时间,超过一定时间,则触发发送心跳包,同时对服务端的响应做计数,超时一定次数未收到心跳响应,则判定服务器下线,触发重连操作。在注册中心系统中,客户端发送的心跳包中,会带上当前客户端的负载信息(连接数或用户数),注册中心根据这些负载信息,可以实现流量的有效负载。
在项目中经常遇到双向通信的场景,如指令的实时下发、状态的上报等,这时候使用 HTTP 协议就有点捉襟见肘。正常情况下一般会使用 TCP/Websocket 协议来实现,不过不同于 HTTP 协议简单及有大量框架的支持,使用 TCP/Websocket 需要考虑心跳、协议的定义、数据的序列化(反序列化)及 RPC 调用的实现。相对来说,入门相对比较复杂。 如果能有一个项目能够对上述功能进行封装,隐藏不同协议之间的差异,对上层应用提供一套统一的接口,上层业务只关心业务,那么就会减少开发人员的学习成本,快速接入项目。 Alligator 项目就是为了解决上述的场景而开发的,它提供了一个框架,可以让开发人员快速进行 TCP/Websocket 及 HTTP 的开发,而无需关心下层使用的协议。在此基础上,Alligator 还提供了一个进行长连接网关开发的脚手架,它是业务无关的,可以快速接入不同的业务场景。
之前买了一台阿里云的云主机,一直想把用起来。考虑到我的个人网站之前部署在 github 上,网页加载比较慢,正好可以用云主机进行部署,提升速度,开始操作。