关于im:如何快速构建可靠的分布式IM聊天系统
起源:如何疾速构建牢靠的分布式IM聊天零碎 tlnetim 聊天我的项目是一个分布式 im demo,基于 tlnet http框架和 tldb数据库。tldb是一个高性能的分布式数据库,基于tldb能够疾速构建分布式系统。 tlnetim 的开源程序: https://github.com/donnie4w/tlnetimhttps://gitee.com/donnie4w/tlnetimtlnetim次要的性能:多聊天室多人聊天零碎,程度扩大多服务器部署构建分布式im.tlnet.top与im2.tlnet.top 是分布式系统的两个不同的服务 用户能够连贯任意一个服务器相互通信除去局部存储数据的实现,im的逻辑代码理论只有几十行,基于tldb mq代码实现分布式的代码也只有几十行。 room, ok := wsmap.Get(ws)if !ok { if wa.ATYPE == LOGIN { if iu, ok := getUserInfo(wa.MSG); ok { room = strings.TrimSpace(wa.ROOM) store(ws, iu, room) //记录登录日志 orm.Insert(&ImLog{UserId: iu.Id, Room: room, Time: TimeNow()}) ws.Send(wsack{ATYPE: wa.ATYPE, USERNAME: iu.Name, ICON: iu.Icon, TIME: TimeNow(), ROOM: room}.toJson()) immq.PubId(room, iu.Id) //返回好友列表 if *UseRobot { ws.Send(wsack{ATYPE: FRIEND, USERNAME: robot.Name, ICON: robot.Icon, LABEL: robot.Label}.toJson()) } broadcastToSelf(&wsack{ATYPE: FRIEND}, ws, room) //告诉好友 broadcast(&wsack{ATYPE: FRIEND, USERNAME: iu.Name, TIME: TimeNow(), ICON: iu.Icon}, ws, room, true, true) //返回聊天室 最新N条数据 if id, _ := orm.SelectIdByIdx[ImMessage]("Room", room); id > 0 { startid := id - 20 if startid < 0 { startid = 0 } if ims, _ := orm.SelectByIdxLimit[ImMessage](startid, 21, "Room", room); ims != nil { for _, im := range ims { var u *ImUser if im.UserId > 1<<60 { u = robot } else { u, _ = orm.SelectById[ImUser](im.UserId) } if u != nil { ws.Send(wsack{ATYPE: MSG, USERNAME: u.Name, ICON: u.Icon, MSG: im.Content, TIME: im.Time}.toJson()) } } } } } else { ws.Send(wsack{ATYPE: NOPASS}.toJson()) } }} else if wa.ATYPE == MSG { iu, _ := getIu(room, ws) t := TimeNow() //保留聊天信息 if _, err := orm.Insert(&ImMessage{UserId: iu.Id, Content: wa.MSG, Time: t, Room: room}); err == nil { //发送聊天数据 broadcast(&wsack{ATYPE: MSG, USERNAME: iu.Name, MSG: wa.MSG, TIME: t, ICON: iu.Icon}, nil, room, true, false) }}tlnet将服务器的websocket封装为 三个阶段: ...