热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux下IMserver搭建

一步一步开始做。附录:一套开源协议:http:www.igniterealtime.orgindex.jspProso:http:prosody.im那谁网友的笔记http

一步一步开始做。

附录:

一套开源协议:http://www.igniterealtime.org/index.jsp

Proso:http://prosody.im/

那谁网友的笔记http://www.cppblog.com/converse/archive/2009/01/13/71902.html

网友的一些观点:

msn是用几个不同的服务器分别运行的不同的服务。比如最前端专门做单点登录。一台做用户列表的管理。再一台专门负责通信。类似如此。
还有是服务器群集的技术,我也不是很了解。高手补充下。

定时发送其实很简单,将待发送数据排程即可。比如,用户希望“一个月后”发送该消息,那么就将该消息和“请求时间+一个月”的时间存放入数据库。——这是进入队列过程。

出队过程就是,将消息按发送时间先后排序,将所有“时间到”的消息发送出去,并根据“最近一条消息时间”安排下次发送即可。

具体架构偶也不是很清晰,不过建议使用RPC中间件。Ice有个Strome就是用于 发布/订阅 模型的,一个人订阅的就是“与他有关”的所有消息,而每个用户可以“发布”消息到好友 或者 聊天室(群)里面,这样就完成了一个基础的IM架构了。分布式的话,设计服务器间同步的接口,然后将用户像撒豆子一样交给各个服务器(通过HASH算法和登入服务器接口),每个用户的消息必定是需要交给一个或多个其它用户的,那么消息就有了“目的地”,根据“豆子们”所在的服务器作为“跳跃门”将消息丢过去,该服务器再根据客户状态要么暂存要么交给客户就好了。

难点有下面两点:

1.用户上下线消息的处理。
  不同的用户分布式策略决定了用户上下线消息的处理。

2.DB的分布式策略
  在同时在线 10万用户的系统里面单数据库显然无法满足需求,
  分布式的数据库策略或者大量的memory cache是个解决方案。

我以前做过一段时间电信,我觉得IM和移动的原理差不多,可以考虑用移动网的架构。

关于DB分布,可以考虑引入两个概念,一个叫归属位置寄存器,另外一个叫拜访位置寄存器。

归属位置寄存器存放用户的原始资料信息,包括用户名和密码。当一个用户在某个服务器上登陆时,服务器根据特定的规则定位(比如依据ID来划分)到这个用户所在的归属位置寄存器,并从该寄存器取得用户信息,然后保存在与这个服务器相关联的拜访位置寄存器中。

我觉得应当包含以下几部分:
1、好友列表、状态维护服务器,用记好友列表的读取以及状态更新等,这一块的实现应当比较复杂,发布式实现也较为麻烦。
2、登录及会话分发服务器,用于用户登录系统,会话实现以及分配聊天服务器。
3、聊天服务器,用户与该服务器直接连接进行,包括离线消息队列等都存储在该机器上。
4、聊天消息中转服务器,对于不同的聊天服务器间消息的分发,牵涉到好友分组。

大概的流程:
1、用户登录,登录及会话服务器验证登录并生成会话,同时分配聊天服务器给窗户端,同时更新好友列表与状态相关信息,和客户端相关信息。
2、客户端拿到会话令牌和分配得到的聊天服务器的信息,连接聊天服务器,聊天服务器到会话服务器进行验证,验证通过后与客户端建立会话,开始聊天。
3、如果对聊天消息不做检查的话,直接走P2P的流程进行聊天,当然如果需要对聊天消息做处理的话就需要走消息中转服务器,如果同服务器的不需要走,不同服务器的走中转服务器进行中转。
4、对于离线消息直接存储到内存队列或者文本DB中,不同服务器间走中转服务器进行中转。
5、对聊天服务器做分配,做负载均衡时需要考虑结点的添加与删除相关发布式实现的常见问题

个人觉得如果P2P应用得好和好友列表及状态维护上也实现得好,那么IM的架构应当是比较不错了的。

以上纯属个人猜想。大家继续!

好友状态可以用简单的Ping Pong机制来确定,另外,我有想将服务器的所谓“中转网络”扩大到客户端的做法。这样,消息中转不一定需要走服务器,直接与客户端连接也可以。涉及到一个不复杂的节点算法流程,与KAD类似。

我觉得不一定像移动网那么复杂,也不一定完全照搬。 
粗略划分了一下: 
对于HLR(归属寄存器),保存帐号的基本信息;基本上是静态数据,也应该包括用户 
最后一次登陆时的服务器等少量的动态信息。 
对于VLR(拜访寄存器),可以用来保存离线消息这类的既时信息(其它用户给当前 
(不在线)用户发的消息)

呃……对了……有大量的基于Jabber的开源服务器可以参考。那些服务器大部分都实现了服务器间通信,以及消息缓存等机制。

如果要现成的,
也许可以看看 ejabberd - Distributed, fault-tolerant Jabber/XMPP server
written in Erlang
http://www.process-one.net/en/projects/ejabberd/

ICE提供的功能也足够实现分布式IM了

im 最大的难点,就是一个定位 和查找的问题。

而最致命的问题,是很多帐户可能不用
归属位置寄存器存放用户的原始资料信息,包括用户名和密码。

这种做法可能会有非常大的浪费。 但是设计合理还是可以用的。

定位和查找,偶们经常使用的树形结构就很有用。比如你打长途电话,如果跨市,就要拨打区号,如果跨国,就要拨打国际长途号码一样——用这种结构,我们用一个目录,就能装下地球上所有人了。什么?你不在里面?抱歉,还米开通火星长途,请等待添加火星服务器……(后面只是玩笑~)

对于游戏im来说还要考虑一账户多脚色多点同登问题。最好是两层登录

IM 架构的考虑,是整体性的考虑,关键问题是你想支持多大的用户并发,多大的用户存储空间,想给用户提供什么样的服务。
是什么规模的集群,楼主可以先考虑一下。
因为大规模和小规模差别太大了。


推荐阅读
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • 后台自动化测试与持续部署实践
    后台自动化测试与持续部署实践https:mp.weixin.qq.comslqwGUCKZM0AvEw_xh-7BDA后台自动化测试与持续部署实践原创 腾讯程序员 腾讯技术工程 2 ... [详细]
author-avatar
我还是看好小棠呀
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有