设备端不间断发送了1000条数据 已经停止了 服务端还在处理数据 要等一段时间才能结束 为什么?

567

设备端不间断发送了1000条数据 已经停止了 服务端还在处理数据 要等一段时间才能结束 为什么? 是gateway 将请求加入队列中了吗

我想知道到底是 阿里云端做的处理 还是网关gateway做的处理 怎么实现的 代码在哪里 我想看看

第二个问题 在大量请求过来的时候(1000个不间断请求) 服务端处理业务有点慢 设备都停止了 服务端还不停的处理

我想知道 怎么提高业务处理性能 因为观察发现服务器的cpu 和内存并没有明显的增加 感觉可能都是在数据库操作 上花费了大量时间 php的性能好像不像是瓶颈 我用得think-orm 感觉 连接数据库应该是长连接了 不知道怎么优化

598 1 1
1个回答

walkor

操作系统有socket缓冲区包括gatewayWorker内部有缓冲区,类似队列的效果。客户端发来的数据会先进入缓冲区,businessWorker会从缓冲区取数据,然后处理。客户端停止发送数据后,缓冲区的数据还在,挤压在缓冲区的数据很多的话,会出现客户端停止后,服务端还在处理数据的情况。有些业务敏感,要求每条消息尽量不能丢,所以即使客户端断开,消息也要处理。如果业务不敏感,可以将gateway到businessworker的缓冲区设置得小一些,例如start_gateway.php里设置$gateway->sendToWorkerBufferSize = 1024; (默认值是10240000也就是大概10MB),这样缓冲区很小,缓冲区满了消息就自自动丢弃了(会产生一些日志)。

压测时业务处理速度慢于客户端发送数据速度是正常的,客户端发送速度可以每秒几万甚至十几万条消息,而业务处理速度可能只有几千(带数据库操作),消息积压是常理之中。如果cpu还很空闲,可以增加businessWorker进程数,这样能够增加业务处理速度。
但是无论怎样,客户端发包速度无限制的话,服务端处理速度是无法跟上客户端发包速度的。

最后长连接业务压测与http压测不太一样,长连接压测需要按照实际场景来压测,比如业务需要维持10万连接,每个连接大概30秒通讯一次,那么服务端的请求量大概是每秒3300,也就是服务端每秒能处理3300个请求即可,假设一个请求有三个数据库操作,裂变成数据库请求可能达到每秒1万,业务优化得好的话能达到。
而按照http压测方式,一个连接每秒就能打出上万请求,裂变成数据库请求每秒3万,数据库可能就处理不过来了,本来能支持10万连接的服务器,压测结论变成只能支持1个连接,这显然是不合理的。

  • 567 2022-12-13

    谢谢大佬 醍醐灌顶 测试的过程中又学习了好多东西 感谢无以言表

年代过于久远,无法发表回答
🔝