Raven: 产品级别 IM 服务搭建底层框架。
使用要求
使用限制
- Raven 框架并没有定义消息协议,由使用方自行定义,使用方通过实现 IMClientListener、IMClientInterceptor 接口来满足自身业务需求。
Raven 特色:
- 使用 Nio 实现,通常单台服务器应支撑 1W - 10W 长链接。
- 限制每个链接单次读、写的最大字节数,防止单链接异常,造成整体消息延迟。
- 完善的日志信息、监控信息,方便问题定位。
Maven 配置
<dependency>
<groupId>com.heimuheimu</groupId>
<artifactId>raven</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
Log4J 配置
# Raven 根日志
log4j.logger.com.heimuheimu.raven=WARN, RAVEN
log4j.additivity.com.heimuheimu.raven=false
log4j.appender.RAVEN=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RAVEN.file=${log.output.directory}/raven/raven.log
log4j.appender.RAVEN.encoding=UTF-8
log4j.appender.RAVEN.DatePattern=_yyyy-MM-dd
log4j.appender.RAVEN.layout=org.apache.log4j.PatternLayout
log4j.appender.RAVEN.layout.ConversionPattern=%d{ISO8601} %-5p [%F:%L] : %m%n
# IM 客户端日志信息
log4j.logger.RAVEN_IM_CLIENT_LOG=INFO, RAVEN_IM_CLIENT_LOG
log4j.additivity.RAVEN_IM_CLIENT_LOG=false
log4j.appender.RAVEN_IM_CLIENT_LOG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RAVEN_IM_CLIENT_LOG.file=${log.output.directory}/raven/im_client.log
log4j.appender.RAVEN_IM_CLIENT_LOG.encoding=UTF-8
log4j.appender.RAVEN_IM_CLIENT_LOG.DatePattern=_yyyy-MM-dd
log4j.appender.RAVEN_IM_CLIENT_LOG.layout=org.apache.log4j.PatternLayout
log4j.appender.RAVEN_IM_CLIENT_LOG.layout.ConversionPattern=%d{ISO8601} %-5p [%F:%L] : %m%n
# IM 客户端管理器日志信息
log4j.logger.RAVEN_IM_CLIENT_MANAGER_LOG=INFO, RAVEN_IM_CLIENT_MANAGER_LOG
log4j.additivity.RAVEN_IM_CLIENT_MANAGER_LOG=false
log4j.appender.RAVEN_IM_CLIENT_MANAGER_LOG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RAVEN_IM_CLIENT_MANAGER_LOG.file=${log.output.directory}/raven/im_client_manager.log
log4j.appender.RAVEN_IM_CLIENT_MANAGER_LOG.encoding=UTF-8
log4j.appender.RAVEN_IM_CLIENT_MANAGER_LOG.DatePattern=_yyyy-MM-dd
log4j.appender.RAVEN_IM_CLIENT_MANAGER_LOG.layout=org.apache.log4j.PatternLayout
log4j.appender.RAVEN_IM_CLIENT_MANAGER_LOG.layout.ConversionPattern=%d{ISO8601} %-5p [%F:%L] : %m%n
# iM 客户端超时扫描任务执行日志信息
log4j.logger.RAVEN_IM_CLIENT_TIMEOUT_LOG=INFO, RAVEN_IM_CLIENT_TIMEOUT_LOG
log4j.additivity.RAVEN_IM_CLIENT_TIMEOUT_LOG=false
log4j.appender.RAVEN_IM_CLIENT_TIMEOUT_LOG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.RAVEN_IM_CLIENT_TIMEOUT_LOG.file=${log.output.directory}/raven/im_client_timeout.log
log4j.appender.RAVEN_IM_CLIENT_TIMEOUT_LOG.encoding=UTF-8
log4j.appender.RAVEN_IM_CLIENT_TIMEOUT_LOG.DatePattern=_yyyy-MM-dd
log4j.appender.RAVEN_IM_CLIENT_TIMEOUT_LOG.layout=org.apache.log4j.PatternLayout
log4j.appender.RAVEN_IM_CLIENT_TIMEOUT_LOG.layout.ConversionPattern=%d{ISO8601} %-5p [%F:%L] : %m%n
Spring 配置
<!-- IM 服务端配置信息 -->
<bean id="ravenServerConfiguration" class="com.heimuheimu.raven.IMServerConfiguration">
<property name="port" value="4182" /> <!-- 监听端口 -->
<property name="socketConfiguration"> <!-- IMServer 与 IM 客户端连接的 {@link SocketChannel} 使用的 Socket 配置信息 -->
<bean class="com.heimuheimu.raven.net.SocketConfiguration">
<property name="keepAlive" value="false" />
<property name="tcpNoDelay" value="false" />
<property name="sendBufferSize" value="32768" />
<property name="receiveBufferSize" value="16384" />
</bean>
</property>
<property name="clientListener" ref="demoRavenIMClientListener" /> <!-- IMClientListener 实现类,由使用方自行实现 -->
<property name="clientTimeout" value="60" /> <!-- IM 客户端超时时间,单位:秒,如果小于等于 0,则不会超时,默认为 60 秒 -->
<property name="poolSize" value="20" /> <!-- IMServer 使用 IM 客户端管理器数量,默认为 20,如果小于等 0,则使用具体实现指定的默认值 -->
<property name="clientManagerConfiguration"> <!-- IM 客户端管理器使用的配置信息 -->
<bean class="com.heimuheimu.raven.clients.IMClientManagerConfiguration">
<property name="capacity" value="10000" /> <!-- 单个管理器可管理的最大 IM 客户端数量,如果小于等于 0 ,则没有数量限制,默认为 -1 -->
</bean>
</property>
<property name="clientManagerListListener"> <!-- IM 客户端管理器列表事件监听器 -->
<bean class="com.heimuheimu.raven.clients.support.NoticeableIMClientManagerListListener">
<constructor-arg index="0" value="your-project-name" /> <!-- 当前项目名称 -->
<constructor-arg index="1" ref="notifierList" /> <!-- 报警器列表,报警器的信息可查看 naivemonitor 项目 -->
</bean>
</property>
<property name="clientInterceptor" ref="demoRavenIMClientInterceptor" /> <!-- IMClientInterceptor 实现类,由使用方自行实现 -->
</bean>
<!-- IM 服务端 -->
<bean id="ravenIMServer" class="com.heimuheimu.raven.IMServer" init-method="init" destroy-method="close">
<constructor-arg index="0" ref="ravenServerConfiguration" />
</bean>
Falcon 监控数据上报 Spring 配置
<!-- 监控数据采集器列表 -->
<util:list id="falconDataCollectorList">
<!-- Raven 信息监控 -->
<bean class="com.heimuheimu.raven.monitor.falcon.IMClientManagerDataCollector" />
<bean class="com.heimuheimu.raven.monitor.falcon.IMClientDataCollector" />
<bean class="com.heimuheimu.raven.monitor.falcon.ByteMessageDataCollector" />
</util:list>
<!-- Falcon 监控数据上报器 -->
<bean id="falconReporter" class="com.heimuheimu.naivemonitor.falcon.FalconReporter" init-method="init" destroy-method="close">
<constructor-arg index="0" value="http://127.0.0.1:1988/v1/push" /> <!-- Falcon 监控数据推送地址 -->
<constructor-arg index="1" ref="falconDataCollectorList" />
</bean>
Falcon 上报数据项说明(上报周期:30秒)
IM 客户端数据项:
- raven_client_established_count/module=raven 当前保持连接的 IM 客户端数量
- raven_client_created_count/module=raven 30 秒内创建的 IM 客户端数量
- raven_client_closed_count/module=raven 30 秒内关闭的 IM 客户端数量
- raven_client_established_error_count/module=raven 30 秒内 IM 客户端创建失败的次数
- raven_client_closed_error_count/module=raven 30 秒内 IM 客户端关闭失败的次数
- raven_client_timeout_count/module=raven 30 秒内发生超时错误的 IM 客户端数量
字节消息发送数据项:
- raven_byte_message_count/module=raven 30 秒内需要发送的消息总数
- raven_byte_message_total_byte_length/module=raven 30 秒内需要发送的字节总长度
- raven_byte_message_avg_byte_length/module=raven 30 秒内需要发送的单条消息平均字节长度
- raven_byte_message_max_byte_length/module=raven 30 秒内需要发送的单条消息最大字节长度
- raven_byte_message_error_count/module=raven 30 秒内发送失败的消息总数
- raven_byte_message_sent_count/module=raven 30 秒内发送成功的消息总数
- raven_byte_message_sent_avg_delay/module=raven 30 秒内发送成功的消息平均延迟时间,单位:毫秒
- raven_byte_message_sent_max_delay/module=raven 30 秒内发送成功的消息最大延迟时间,单位:毫秒
IM 客户端管理器数据项:
- raven_manager_count/module=raven 当前可用的 IM 客户端管理器数量
- raven_manager_avg_client_count/module=raven 当前每个 IM 客户端管理器已管理的 IM 客户端平均数量
- raven_manager_max_client_count/module=raven 当前单个 IM 客户端管理器已管理的 IM 客户端最大数量
- raven_manager_readable_client_count/module=raven 30 秒内可读的 IM 客户端数量
- raven_manager_writable_client_count/module=raven 30 秒内可写的 IM 客户端数量
IM 客户端管理器执行数据项:
- raven_manager_tps/module=raven 迭代所有可用的 IM 客户端方法在 30 秒内每秒平均执行次数
- raven_manager_peak_tps/module=raven 迭代所有可用的 IM 客户端方法在 30 秒内每秒最大执行次数
- raven_manager_avg_exec_time/module=raven 迭代所有可用的 IM 客户端方法在 30 秒内单次操作平均执行时间
- raven_manager_max_exec_time/module=raven 迭代所有可用的 IM 客户端方法在 30 秒内单次操作最大执行时间
- raven_manager_register_error_count/module=raven 30 秒内遇到的 IM 客户端注册失败错误次数
- raven_manager_communicate_error_count/module=raven 30 秒内遇到的 IM 客户端通信失败错误次数
- raven_manager_select_error_count/module=raven 30 秒内遇到的 IM 客户端选择失败错误次数
IM 客户端管理器 Socket 数据项:
- raven_manager_socket_read_bytes/module=raven 30 秒内 Socket 读取的总字节数
- raven_manager_socket_avg_read_bytes/module=raven 30 秒内 Socket 每次读取的平均字节数
- raven_manager_socket_max_read_bytes/module=raven 30 秒内 Socket 单次读取的最大字节数
- raven_manager_socket_written_bytes/module=raven 30 秒内 Socket 写入的总字节数
- raven_manager_socket_avg_written_bytes/module=raven 30 秒内 Socket 每次写入的平均字节数
- raven_manager_socket_max_written_bytes/module=raven 30 秒内 Socket 单次写入的最大字节数
更多信息