找到10226个回复
嘿嘿,我原来也美化过
@老虎会游泳,群聊风暴的问题,我是使用了group_id赋予群的内部编号,这样系统逻辑需要推送的时候,只要解析这个id就知道具体的分布式中的目标gateway的ip:port,这样就不会造成群惊了,
,
目前发现,只要有- 或者> 就会这样,去掉就正常,
用strconv.Quote()解决,因为特殊符号被转义为实体动作了,或者用log.printf(“%s”,str)解决
我问了一下gpt4,以下是gpt4的回复,从你的描述看,这个问题可能并不是一个 bug,而是因为
log.Println()
和fmt.Println()
对待参数的方式有所不同。
log.Println()
函数会为每个参数调用fmt.Sprint()
来生成输出的字符串。在你的第一个例子中,你传递给log.Println()
的是一个字节切片(startInfo.Bytes()
),fmt.Sprint()
会将这个字节切片转换为一个字符串,其中每个字节都被转换为其对应的十进制数值,这就是为什么你看到一串数字的原因。在你的第二个例子中,你传递给
log.Println()
的是一个字符串(startInfo.String()
)。这个字符串应该能正常打印出来,但是你说结果卡住了。这可能是因为你的环境或者终端有些问题,或者是因为register.ListenAddr
中包含了一些非打印字符,导致在终端上看起来像是卡住了。你提到你已经设置了
log.SetOutput(file)
,并且在文件中的记录是正常的,这说明log.Println()
是正常工作的。你可以尝试在不同的终端或者环境下运行你的程序,看看是否还会出现同样的问题。如果使用
fmt.Println()
没有问题,那么在这种情况下,你可以继续使用fmt.Println()
来打印日志。如果你需要的是将日志写入文件,那么你可能需要使用log
包,因为fmt
包并没有提供设置输出的功能。另外,你也可以尝试一下
log.Printf()
函数,这个函数允许你指定一个格式字符串,可以更精确地控制输出的格式。例如:log.Printf("[%s] Starting server at -> %s ;Listening...\n", register.Name, register.ListenAddr)
这样,你就不需要使用
bytes.Buffer
来手动构建字符串了。
QQ客户端和服务器之间有心跳机制,客户端通过周期性心跳上报,可知道什么时候需要
拉消息
或服务器知道什么时候推消息
~~~
@无名啊,直播间弹幕甚至可以像直播本身一样通过无状态HTTP服务器分发,按时间切片放在不同的json文件里,然后由一个列表(类似m3u8)不断列出最新的json文件名,由播放器自行下载展示。这样就能用分发直播视频流的渠道分发弹幕了。
@无名啊,直播弹幕和群聊的不同点:
- 历史记录:如果对方发消息时你不在线,群聊允许你稍后接收消息,但直播就直接错过了。
- 连接数量:为每个直播间建立一个TCP连接是可接受的,但为每个群建立一个TCP连接似乎不可接受(你可能加入了几百个群)。所以群聊必须由服务器合并你收到的消息,但直播间不需要合并。
- 消息可达性:未收到某个群消息是不可接受的,但未收到某些弹幕完全可以。很多人气很高的直播间弹幕一屏根本放不下,都是裁剪后显示的,每个人都只收到了部分弹幕。
@无名啊,因为每个直播都是一个单独的连接,不需要考虑多个群共享连接,所以采用CDN模型就行了,由一个中心服务器负责发送消息,然后逐级分发给全国CDN,每个人收到的消息都一样。发弹幕则是统一发给那个中心服务器。
可以的,但是要joycon吧?
yy几万人在一个频道即时聊天 当年可是行业翘楚
@加勒比海带,是,所以QQ群有人数上限,就是为了避免单个群连接数太高服务器撑不住,以及形成广播风暴(每发一个消息就要转发给几千人这种)。限制为几百人是比较合适的。
至于具体的实现,可以采用消息中继模型:
- 我只与负责我登录的服务器联系。群里的其他人各自在他们的服务器,和我可以不在同一个服务器。
- 每个群都有一个专门负责的服务器进行中继。
- 有人发消息时,先发给自己的服务器,然后自己的服务器把消息转发给对应群的中继服务器,中继再查找各个群成员在哪个服务器,并逐一转发。最后群里的所有人都收到了消息。
- 此时设置群成员上限就很有必要,否则每次发消息都相当于给所有服务器都发了一遍,形成广播风暴。