昨天「去哪儿」开源了自研的 IM Startalk,作为一个在 IM 领域划水了一段时间的人,也想了解下其他人是如何去考虑 IM 设计,所以就开始了源码阅读之旅。接下来会用几篇文章简单分析一下。
本篇分析的是 Cowboy HTTP Server.
基本采用了 Cowboy HTTP 框架实现,路由表保存在 config 中: config/ejb_http_server.config,让我想到 Haskell 的 yesod Orz。 于是整个项目就相对比较清晰了。 下面挑几个感兴趣的 API 来分析。
从这个 module
可以看到几个点:
ets
缓存到 erlang 内。Host
划分,跟 Domain
相关。猜测是类似于 BearyChat 的 Team 的概念。u
是通过 query string 传进来,可能会有 username@domain
的形式存在。可以得到几个信息
check_time_limit
对请求做了一次频率限制和 p2p 消息类似,不赘述
User
和 Domain
查出 Time
之后所有消息。这个 module 提供了一个 POST API,能查询 p2p 和 room 的聊天记录(通过 flag参数控制)。
p2p 部分和
http_getmsgs.erl提供的又不太一样,虽然是从同一张表查询,但这个
module会根据 Timestamp 判断是否在一个月内的数据,是的话会从
msg_history中查询,否则从
msg_history_backup查询。
而 room 部分,会从
muc_room_history` 查询。
发送消息流程:
但是目前无法理解几个地方,rpc_send_message/1 中,rpc:call
调用的是另一个节点同一个模块(http_sendmessage
)的 http_send_message
函数。但实际上并不存在这个一个函数。即使存在,也不明白为何要进行一次 Erlang rpc 将创建消息的请求交给另一个节点处理,目前没发现负载检测的模块,所以通过当前节点发送 HTTP 请求应该会更快点。
escape
是手写的,这里会是一个注入点。