基于TCP的分布式IM架构

IM框架由一个根网关服务器RootServer和一个数据中心DataCenter以及多个分布式服务器集群ChatServerCluster组成;

RootServer:根网关服务器,基于libfdk的高并发TCP服务器fdkrootserver;
DataCenter:在FreeBSD上搭建PostgreSQL;

一个服务器集群ServerCluster, 由
LoginServer(1#), GateServer(1#),
ChatServer(10#),
StateServer(2#), OfflineMsgServer(2#),
给 1M个用户提供正常的聊天服务;
除了登录验证, 不进行任何数据库操作, 在线状态管理全部交给分布式StateServer存储(Key-Value), 跨ChatServer的聊天通过GateServer检索StateServer确定Client的位置, 进行数据转发;
离线消息全部存储到 OfflineMsgServer中。

  1. LoginServer:登陆服务器, 基于libfdk的高并发TCP服务器fdkloginserver, 负责以下两个功能模块:
    • 用户登录验证, 向数据中心请求登陆验证信息;
    • 本集群内的聊天服务器负载平衡。
  2. GateServer:网关服务器, 基于libfdk的高并发TCP服务器fdkgateserver, 负责本集群内所有用户所在ChatServer的定位和查找,以及聊天消息的转发。
  3. ChatServer:聊天服务器, 基于libfdk的高并发TCP服务器fdkchatserver, 设计每一台服务于100K个客户端的聊天逻辑;
  4. StateServer:状态服务器,管理所有用户所在的服务器,由多台memcached组成分布式的位置信息管理 ;
  5. OfflineMsgServer:离线消息服务器,由多台memcached组成分布式的离线信息管理;

1)问题:每个集群的离线消息存储在本地,当客户端登录时,如何完整的获得离线消息?
SpriteRay:当用户B向离线用户A发送消息,ChatServer把B->A的离线消息存储在本地的OfflineMsgServer中,当A登录时,检索完在线用户后,顺带检索一下所有服务器集群,自然会获得所有离线消息,由客户端进行所有消息的排序。

libmemcache和queue.h的冲突

最近前段时间对libmemcache进行封装,准备加入到libfdk中,

由于memcached支持分布式查询,所以需要管理一个memcached服务器的列表,就想到了系统中自带的SLIST的宏,就在/usr/include/sys/queue.h中。

在编译的时候出现了一堆TAILQ的重复定义的错误。

less memcache.h,发现其中一堆从queue.h中截取的TAILQ的定义宏。

所以建议大家在编译的时候注意这个问题。

我的做法是,在memcache.h中加入#include <sys/queue.h>, 并注释掉那段对TAILQ定义的宏。

FreeBSD 8.0 新特性概览

前段时间在wiki.freebsdchina.org中看到了FreeBSD8.0的新特性,总结了自己关注的几个特点:

第一、AMD64平台内核的内存上限增加

现状:提交至CURRENT, 合并回STABLE
将出现在8.0: 确定
作者:Alan Cox
网址: 公告

一些时兴的功能(其中目前最引人注目的是 ZFS )需要大量的内核内存(与传统的磁盘高速缓存或系统可见内存容量无关) .直至目前为止,kmem_max 仅能分配到最高2 GB的空间,这点正在趋于紧缺。
此限制最近已增加至512 GB的。加上ARC 的 backpressur改善,这将会是ZFS 用户喜闻乐见的。

第二、内核级线程

现状:提交至CURRENT
将出现在8.0: 确定
作者:Julian Elischer
网址: 已提交信息

目前的内核线程实际上是“重量级”的进程在内核地址空间上运行。
这项改进引入了真正轻量级的内核线程, 消耗较少的底层资源(进程锁,内存映射表)。

第三、ULE 3.0: 为 SMP 优化的新调度器

现状:提交至CURRENT
将出现在8.0: 确定
作者:Jeff Roberson
网址: 已提交信息, 已提交信息, 公告

ULE 调度器的演变带来了支持细粒度的CPU粘着度的计算,同时将CPU的物理拓扑结构(缓存,多核,多socket )
并大大改善了线程绑定到CPU的支持.如此带来额外的功能(展现了分配特定 CPU 到 Jails 的可能性)和可观的性能改进。

第四、内核的NFS锁支持

现状:提交至CURRENT
将出现在8.0: 确定
作者:Doug Rabson
网址: 已提交信息, 公告

NFS的锁管理器改善了NFS锁(用来同步文件访问远程机器)在内核中的性能和行为。
新功能包括:多线程操作, 死锁检测, 与限定于服务器上的文档互动。

第五、NFSv4支持

现状:正在开发
将出现在8.0: 可能
作者:Rick Macklem
网址: 召唤测试者

NFSv4是NFS 协议的一个重大改动 ,它带来许多新的功能,如状态协议,性能方面的改进和更强大的安全特性( ACLs ,强认证). 直到最近, NFSv4支持在FreeBSD是不完整的(仅客户端),而且有些不稳定。新的开发目标是完成这一支持。
这一引进的 NFSv4 基础设施亦将采用新的取代原有的 NFSv2 和 NFSv3 服务端以及客户端。