我开发了一个emqx插件,插件的功能是把数据转发到redis,但发现并发数据的时候会报msg: kick_session_due_to_banned, mfa: emqx_banned:on_banned/1,发现客户端很多被断开,请问这个是什么原因导致呢?
kick_session_due_to_banned和你的插件应该没有关系 。这个是在 dashboard 的黑名单里面有一些 clientid 被禁止登录了。
有 2 个原因:
- 手动在 dashbaord 上添加了黑名单的 clientid
- 你开启了Flapping Detection,他会自动添加异常的 clientid 到黑名单里面:
但我发现我开启了插件的,才会导致有的客户端不停的重连加入黑名单的,我是在钩子message.publish 做逻辑处理的,另外在这个里边做逻辑我也压测了下,性能会比不开启插件有很大的下降,我如果想在不影响已有的性能下,数据推送成功后再做逻辑,我应该在哪里做钩子更合适呢?
听起来是你的你的插件处理数据太慢了。导致客户端有消息累积,然后掉线重连。
如果是单纯的放到 redis 里面,不应该会慢的。建议你看检查一下代码。
同时不推荐在钩子里面做同步写数据库的操作。应该在数据库前面有一个进程池,在钩子里面异步把消息到进程池处理会好一些。
谢谢您的建议,但我们需要数据同步,由于emqx不支持读,所以我们才考虑到写数据库,保证写成功后再把数据推到订阅者,如果在钩子里面异步把消息到进程池处理,这种没法保证数据的循序问题。
方便插件开源吗?看看尝试着优化