-
Notifications
You must be signed in to change notification settings - Fork 510
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
easyswoole 使用php-amqplib/php-amqplib 进行自定义消费会出现mysql连接断开 #534
Comments
是因为rabbitmq 中的订阅消息模式是采用的while true死循环,导致mysql链接池无法回收process中的链接,如果队列中在一定时间内不进行sql操作,导致链接空闲时间达到数据库空闲链接时间上限,mysql会主动断开此链接,由于ORM未进行重连机制,所以会一段时间没有操作后出现此报错 SQLSTATE[HY000] [2006] MySQL server has gone away,需要更换mysql 操作工具,可使用此包,composer require simple-swoole/db(包内部采用了短线重连机制,并实现了swoole自带链接池),使用process的时候尽量不进行调用外部类方法,redis尽量也使用独立的链接(可采用REDIS扩展) 整体集成方案可参考此包 |
谢谢,我目前使用的解决方案是 |
队列注意ACK机制,防止消息丢失,其他问题不大 |
我是采用手动ack,就是必须执行完成后我才提交ack,这样进程下次启动,消息依然会被消费,直到正常执行完成
|
官方一直没解决这个问题 也没办法 |
可以使用非连接池模式,用 easyswoole/mysqli 组件即可,当需要使用数据库时才进行连接mysql并操作数据 |
软件版本:
easyswoole: 3.5.1
php-amqplib/php-amqplib:3.1.2
swoole: 4.4.23
问题出现时机:
1、项目运行1天样子基本就会出现 SQLSTATE[HY000] [2006] MySQL server has gone away ,一旦自定义进程出现这个报错,必须重启进程才可以解决,
2、在项目消费者里面已经尝试加了 \Co::sleep(0.01);,并未解决mysql 链接断开的问题
一旦自定义进程报 MySQL server has gone away,后面的消费 依然是继续报:
Connection reset by peer or Transport endpoint is not connected
群里网名“ 那就这样吧” 的开发者也遇到同样的问题
目前的解决办法:
1、捕获异常,重新入列,然后重启进程
希望官方解决一下这个问题,感谢
自定义进程代码:
The text was updated successfully, but these errors were encountered: