作者回复: 期中实战只是个简易版demo哈,期末的实战会基于目前轮询的方式进行长连接改造,再加上ack和心跳等功能,这样也让大家能对“消息推送实时性”的实现方案有一个比对。
另外,实战的目的是让大家自己尝试结合课程前面的内容来练手加深对知识的理解,所以提供的demo并不具备线上可用性,只是一个简单的参考。
作者回复: 就是嵌入到jvm里的一些中间件和db,web容器这些,随着jvm启动也能跟着一起run起来,用起来比较方便。
作者回复: 会存两条,咱们课程2里面有讲过的哦
作者回复: 嗯,这个demo没有用lua来保障原子性,所以是会存在并发更新的一致性问题,有兴趣的话可以尝试来优化改造试试哈,核心lua代码在文章中有。
作者回复: 期末的代码基本没有覆盖期中的哈,都是独立的功能和实现,页面也都是独立的。
作者回复: 群发消息qps很高的话就不要用mysql这种关系型数据库啦,另外也不需要发件人维度的消息存储,可以考虑采用hbase这类nosql数据库来存储索引。
作者回复: 😺 谢谢
作者回复: 还有其他报错吗?比如“This redis server instance is already running...”或者“Failed to start Redis instance”。可以断点跟进到start方法里去看看。
作者回复: 存消息队列的问题在于你需不需要按会话维度啥的来进行查询,分页等等。如果不需要,可以只根据uid维度来暂存消息和信令。
作者回复: 建议还是动手写一写,一码胜千言~
作者回复: 是的,redis的事务只保证这些命令原子执行,执行过程中就算有命令失败,队列中的其他命令也会被执行,所以调用方需要根据返回结果来进行二次处理。
作者回复: 分页的时候会用到。比如:
select msgid from IM_MSG_RELATION where owner_uid=? and other_uid=? and mid <= ? order by mid desc limit ?,?
作者回复: 嗯,是冗余了一下,主要是方便离线统计和后台使用,业务上可以不需要。