Erlang/Elixir 自己写的 IM,来这边推广一下。

wudixiaotie · 2015年09月12日 · 最后由 pynix 回复于 2015年09月24日 · 3822 次阅读

IM Server 链接: simple_im IM Client 链接: simple_client 基本功能: 1.没有是否在线,对朋友就能发消息,如果不在线则存离线,离线保存 7 天。 2.群聊 基本架构参考了 ejabberd,跟它不同的是: 1.协议不用 xml stream 改用 toml,这样节约流量,而且很多没用的协议部分也都删除了,例如出席等,基本都是我重新定义的协议,跟 xmpp 没啥关系,随着需要添加。 2.session 不用 mnesia 而用 ets,说实话 ejabberd 用 dirty_wirte 和 ets 跨节点发消息没啥区别,反而 ets 效率更高。 3.添加了 ack。 4.把 hook 拿掉了,感觉那东西完全就是一个多此一举的东西,效率低不说,代码完全无法阅读,只能在线调试才知道走到哪!! 5.关系数据库用的 pg,驱动是epgsql/epgsql,链接池是我自己写的,简单高效,为什么不用 poolboy,因为这个 driver 的查询支持同一数据库连接的并发查询。

现在的进度: 能实现 1v1 聊天和群聊,不过登录功能是假的,群成员列表也是假数据,因为今天才定下来要采用 postgresql 做关系数据库。现在有了 db migrate 文件,还没写 users 和 groups 的业务逻辑。欢迎大家提意见讨论。

补充一下:本项目天然支持分布式啊,多节点我测试没啥问题,但节点撑个 100W 的客户端链接完全没压力啊(前提你要用好机器),多节点每个节点都要指定 father node,用来从他那里同步 session 数据和联通节点。1000W 的 session 数据同步我测试了大概几秒钟就完成了。

赞一个,借鉴了不少东西。

群聊和私聊的消息结构是一样的吗?

#1 楼 @lidashuang toml 支持日期和时间

#3 楼 @yakczh 不一样 github 上有消息结构

#4 楼 @luikore 恩 这是我疏忽 居然忘了给消息加时间。Thanks

#7 楼 @crazyjin 这个是聊天室?聊天室简单的用 rails 就可以搭,为啥用 elixir。聊天室和 im 还是有区别的,首先聊天室的在线数最多 1000 就到头了,你见过几千人的聊天室么?发送的消息都看不过来。IM 起码要支持的用户数都是以万为单位的,erlang 的做法是每个用户链接都有 1 个或者几个进程去处理。这样随随便便进程数就在十万级或者百万级的范围了,这时进程的通信,进程的查找都是需要解决的问题,这些问题对聊天室来说完全不存在。聊天室的逻辑就是我把每个消息都推送给每个在线的人,而 IM 呢,我要考虑接收消息方不在线的情况,我要存离线, 不管用什么存,我都要有个链接池来管理数据库的链接。链接池很好做,但是稳定容错性能高的连接池就要考虑很多东西。

#7 楼 @crazyjin heroku 没法部署 erlang 代码 否则我也会部署上去的

#9 楼 @wudixiaotie 可以部署的。。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号