需求出发点:
- 公司基于微软的Skype For Business Server(简称Lync)做聊天记录的索引和全文查询。
- 原生Lync 聊天记录数据库中,保存的格式有RTF,HTML,以及PlainText格式,需要通过ETL的技术把数据从Lync归档数据库加工到中央存储中。
- 由于存在多个站点,以及多个Lync Pool的部署方式,需要考虑多归档数据库数据源合并的问题,并且需要支持全量以及增量的同步方式。
- 微软默认Lync聊天记录保存在原始数据库中3个月,最多可以设置保存一年,需要考虑中央数据增长问题。
传统解决方案:
- 利用后台服务定期抓取原数据库数据,通过程序转换RTF以及HTML格式的文本为纯文本格式。
- 通过SessionIdTime为主键,导入Message表,ConferenceMessage表,保存IM发件人和收件人的SIP地址。
- 单台机器,多线程并发处理每个月的聊天记录,提高吞吐量。
- 利用Lucene对于聊天内容进行中文分词。
- 创建SQL全文索引,保存中文分词内容, 提高查询速度以及查询准确度。
- 以年作为SQL分区函数,以保证整体查询速度。
分布式解决方案:
1.实现方式
- 基于AKKA分布式计算框架的方案,由单机模式,横向扩展到多服务器并发处理模型。
- 利用AKKA Remote Actor特性,实现远程计算节点的透明控制。
- 利用AKKA Route 特性,实现控制节点,对于计算节点的任务分配。
- 利用AKKA Dispacher实现计算节点的 FORK-JOIN-EXECUTOR 多线程处理。
- 使用AKKA Supervisor 以及 EventStream 事件订阅,实现Actor之间的监控。
2.部署方式
- AKKA Remote Actor使用Microkernel方式部署。
- 控制节点使用Netty客户端方式,联系各个计算节点中的Agent,并且告知应该开启多少个Remote Actor提供计算能力。
- 计算节点的Agent使用Netty编写,并且以JavaService的方式,打包为后台服务监听来自于控制节点的请求。
- 计算节点的Agent使用自定义的PowerShell脚本开启Remote Actor进程以及监听端口。
3.后续改进
- 现有架构,需要预先设定好计算节点的IP地址以及端口配置,后期会修改成为AKKA Remote Actor以随即端口方式监听。
- 配合Agent以及AKKA Remote Actor自行汇报服务器信息以及端口信息给Master节点,以实现注册功能(使用ZooKeeper实现服务目录)。
图1 : Remote Actor计算过程
图2 : Lync聊天记录截屏
【广告位】 如有任何Lync以及微软UC相关开发需求,可随时访问 www.msucplus.com 或 QQ:110755057进行垂询。