Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于消息处理的一点想法 #4

Open
Hstb1230 opened this issue Feb 23, 2018 · 3 comments
Open

关于消息处理的一点想法 #4

Hstb1230 opened this issue Feb 23, 2018 · 3 comments

Comments

@Hstb1230
Copy link
Owner

Hstb1230 commented Feb 23, 2018

前段时间@ℳℓdhdjℳℓSYS 跟我反馈了一个问题:
当有用户恶意刷消息,导致消息频率变高时,消息的处理时间会越来越长(一条消息光提交的时间就可以高达几秒)。
原本我以为是php后端处理高并发量的影响,但是经过一系列测试,我发现并不是PHP的锅。
第一,收到消息后,插件先将消息内容写到文件后再进行处理。而消息频率的升高,使得该文件处于不断被读写的过程,因而操作时间变长了。
第二,处理消息的过程中,插件会生成一条日志记录,不管是使用酷Q还是插件自带日志,都是需要等到记录被写入文件后(并显示在日志窗口上)才算处理完毕,而这个过程同前面一样影响操作时间。

因此,对新版本做出如下改进:

  1. 抛弃原有的写到文件后再处理做法,直接将文本指针传递给线程处理。
  2. 生成日志记录时,将同样使用线程完成相应操作,并且加入读写锁避免多个相同操作发生时出错,(以上仅针对插件自带日志)

另外,经过多天的思考,对@ℳℓdhdjℳℓSYS 提出的“限制提交频率”作出一个回应:
因为插件现在使用线程处理消息,那么,在此基础上作一个变动:额外使用一个线程池,这个线程池用来分配消息处理入口,但是并不是所有消息都通过线程池进入处理入口。具体是这样的:限制线程池的线程数量,(即设置线程池掌管的入口数量)。另外设定一个阈值,用来区分正常频率和不正常频率,当 单个消息来源(群/QQ) 处于正常频率时,插件就正常处理(也就是允许不经过线程池就直接进入处理入口);而当消息频率处于不正常频率范围后(即超过阈值),插件就将这个消息来源的所有新消息都加入到线程池里,让这些新消息去争夺线程池中有限的处理入口,抢不到的就排队等待,这样既能缓解后端服务器的处理压力,又能保证业务的正常运行。

@dhdjSYS
Copy link

dhdjSYS commented Feb 24, 2018

不错不错不错不错谢谢dalao

@ccdalao
Copy link

ccdalao commented Feb 24, 2018

six

@Hstb1230
Copy link
Owner Author

看上去这个功能是无望了(咕咕咕)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants