为什么80%的码农都做不了架构师?>>>   

使用过ejabberd的或许知道,也许踩过这个坑。那么就说说我们踩过的ejabberd的离线消息的坑吧。

ejabberd原生的离线消息的机制是,一般用户保存100条离线消息,管理员保存5000条离线消息。超过之后竟然没有删除老的离线消息的机制。? 仅仅是报一个警告。

1

2

3

max_user_offline_messages:

    - 5000: admin

    - 100

1

2

<<"Your contact offline message queue is "

"full. The message has been discarded.">>

  

ejabberd原生的群聊是没有离线消息的,只要用户不在线,这期间其他群成员在群里面的聊天,不在线的用户上线后收不到这些消息的。

完全跟现在的一些即时聊天软件不一样,太不好耍了,而且一些客户都是按照某信的要求来看待的,对比一下就会发现这些问题,然后就是一堆的需求。

按照现在的即时聊天软件,我们在原来的基础上实现了群聊离线消息的机制,还添加多客户端消息同步的机制,那么一条离线消息就咬保存好几份了,然后的条数限制远远不够了,即使调了离线消息的配置(由原来的100改为2000),在一个群里面疯狂的聊天,一下子就满了。

好吧,那么就添加删除的机制吧,只要用户的离线消息大于配置的条数,那么就删除超出配置的老的离线消息。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

%% Warn senders that their messages have been discarded:

% discard_warn_sender(Msgs) ->

%     lists:foreach(fun (#offline_msg{from = From, to = To,

%                   packet = Packet}) ->

%             ErrText = <<"Your contact offline message queue is "

%                     "full. The message has been discarded.">>,

%             Lang = xml:get_tag_attr_s(<<"xml:lang">>, Packet),

%             Err = jlib:make_error_reply(Packet,

%                             ?ERRT_RESOURCE_CONSTRAINT(Lang,

%                                       ErrText)),

%             ejabberd_router:route(To, From, Err)

%         end,

%         Msgs).

discard_warn_sender(USMsgsCountMaxOfflineMsgs, mnesia) ->

    ?INFO_MSG("Begin to discard offline msgs at time:~s", [erlang:timestamp()]),

    R = mnesia:select(offline_msg,[{#offline_msg{us = US, _='_'},[],['$_']}]),

    Rsort lists:sort(fun(A, B) -> A#offline_msg.timestamp < B#offline_msg.timestamp end,R),

    {M, _} = lists:split(Count MaxOfflineMsgsRsort),

    F = fun() ->

        lists:foreach(fun(X) ->

            mnesia:delete_object(X)

        end,M),

        if Count MaxOfflineMsgs >= (?OFFLINE_TABLE_LOCK_THRESHOLD) ->

                  mnesia:write_lock_table(offline_msg);

            true -> ok

        end,

        lists:foreach(fun (N) -> mnesia:write(N) endMsgs)

    end,

    mnesia:transaction(F),

    ?INFO_MSG("Discard offline msgs:~w", [M]),

    ?INFO_MSG("End to discard offline msgs at time:~s", [erlang:timestamp()]);

改造了一些源代码,思路就是先查询到所有的离线消息,排序删除老的离线消息。(本来不熟悉erlang的,业务需求硬着头皮改的。大家轻喷)

然后呢,又有效率问题。只要用户离线消息满了,就会一直循环这个删除动作,不停的查询所有的离线消息,删掉超出的部分。

既然这样,那就不限制离线消息的条数了。注释掉这个方法,测试一下静观其变吧。

好吧,即使这样还是有问题。mnsia的offline_msg表只要超过2G,模块就会奔溃。

1

As far as I know dets can only handle 2GB files not 4GB, which will be the limit for disc_copies. There is an experimental 64-bit dets which can handle much larger files but no one has used it in production yet. – Happi 

查到一些资料,Mnesia 单表的存储容量(Dets)目前只能处理2G。由于现在我们是 disc_only_copies,即现在离线消息占用的应该是磁盘。目前 Offline Mod 崩溃都是离线消息存储到达 2G 的时候,所以推测是触到 Mnesia 单表处理上线了。

这个就真的没有办法,那就只能将离线消息保存到MySQL中了,原生的本来就支持ODBC。

按照一些教程配置吧,很快就好了。主要是在mod_offline模块添加db_type:odbc就行。

额,又有小问题,emoji问题,那就又搜教程配置MySQL数据库,改表吧。

一路磕磕碰碰的,献给那些走在路上的人和那些即将走到路上的人。

转载于:https://my.oschina.net/csq/blog/739201

说说ejabberd离线消息踩过的坑相关推荐

  1. uniapp unipush接入个推消息推送(各种踩坑记录)安卓+IOS+在线消息+离线消息

    uniapp 消息推送功能实现 上周公司要求做一个消息推送的功能,由于现有的电商APP是用uniapp做的,所以优先考虑uniapp自带的unipush消息推送. ios证书导出踩坑 ios推送证书导 ...

  2. 小程序统一服务消息_[miniblog]小程序订阅消息踩坑记

    有阵子没有更新我的mini-blog了,这次把推送消息那块做了些改动,小程序的模板消息即将废弃,订阅消息终于来了. 关于订阅消息 订阅消息分为一次性订阅和长期订阅,长期订阅就不说啦,不是个人号可以染指 ...

  3. 微信小程序发送模板消息踩的坑

    在微信的微信小程序中,微信提供了和微信服务号相同的模板消息功能. 但是,虽然都是发送模板消息,小程序和服务号的模板消息的使用还是有差别的. 对于微信服务号的模板消息只要通过查看文档就能够知道我们使用模 ...

  4. Android集成小米华为推送以及收不到离线消息的坑

    华为推送 1.应用被杀后,无法收到透传消息? 应用被杀死后,无法收到透传消息,再手动打开app,也收不到之前发送的消息,像有的第三SDK,应用被杀后,再打开app,还可以收到之前的离线消息,华为推送不 ...

  5. uniapp打包app,对接华为厂商,实现unipush离线消息推送

    今天终于可以抽出点时间,来记录一下这几天心塞的心情.上周公司派过来一个活,说是使用uniapp制作一个app,同时要实现在线消息推送和离线消息推送,啥话没说就揽了下来.不过说实在的,从来没有开发过ap ...

  6. 启动mq 在虚拟机中_记在使用rocketmq client客户端过程中踩到的坑

    前言 最近项目中使用阿里的RocketMQ来做消息队列,具体怎么使用RocketMQ不在本文讨论范围之内,其相关帮助文档可以参考如下链接 本文主要记录在使用rocketmq client时,遇到的一些 ...

  7. 游戏服务器数据库踩过的坑

    在页游服务器这块很早之前一直没有认真考虑过,大部分是之前搭建好的,我只需要按照他原来的设计继续码代码就好了. 可是这次服务器重构的过程中,还是遇到了很多始料不及的问题.那么就按照踩过的坑,去一个个讲讲 ...

  8. 币小秘:这些年,见过的带单老师们,这里有没有你踩过的坑?

    币小秘:这些年,见过的带单老师们,这里有没有你踩过的坑? 这是一个零和博弈的市场,你赚的一定是别人亏的,只有你亏了,别人才能赚,带单老师每天晒出来的盈利几万.几十万的,是哪儿来的呢?(我后面会详解) ...

  9. IM开发干货分享:我是如何解决大量离线消息导致客户端卡顿的

    1.引言 好久没写技术文章了,今天这篇不是原理性文章,而是为大家分享一下由笔者主导开发实施的IM即时通讯聊天系统,针对大量离线消息(包括消息漫游)导致的用户体验问题的升级改造全过程. 文章中,我将从如 ...

  10. 科大讯飞踩过的“坑”,还有多少AI企业要踩?

    立志不坚,终不济事.--朱熹  中国软件网每日精选文集 科大讯飞的裁员潮 一直从春节前蔓延到了春节后, 爆发裁员潮的原因 究竟是自身能力不足还是市场环境造就? 那些科大讯飞踩过的"坑&quo ...

最新文章

  1. TensorFlow损失函数
  2. EffectiveC++ Item11
  3. linux docker 容器运行后不退出的方法
  4. HDU - 3533 Escape(预处理+A*)
  5. CISCO ACL配置全解
  6. cf1562E. Rescue Niwen!
  7. PyMC3实现贝叶斯神经网络
  8. php 仿电脑桌面系统,EonerCMS——做一个仿桌面系统的CMS(十-附最新源码)
  9. python3调用adb命令_Python操作adb命令
  10. 想悄悄的做渗透测试?这里的工具足够你用了
  11. 12年前的 Linux bug 复活,DNS 缓存投毒攻击重现
  12. Git下修改提交的author和email信息
  13. Extjs Ext.net中的常用属性
  14. PS 制作ICO图标和图片背景透明化
  15. js小学生图片_小学生画报设计图片
  16. java实习面试题整理
  17. 5G技术详解系列-PDU会话签约数据(6)
  18. 考研英语近义词与反义词·三
  19. execute immediate 用法详解
  20. jQuery插件库免下载做法

热门文章

  1. 后台运行 命令_Docker基本命令
  2. Latex:图片排版的位置参数【htbp】
  3. Python argparse模块、argparse.ArgumentParser()用法解析
  4. 让用户输入一个月份,判断这个月是哪个季节?
  5. IBM DB2关键特性解析:DB2分区特性
  6. CentOS7搭建本地yum源之http服务
  7. Linus 谈软件开发管理经验
  8. Selenium webdriver实现原理
  9. Ubuntu 16.04 LTS 下Nginx的编译安装与启动
  10. verilog语法学习心得