【golang】高并发下TCP常见问题解决方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【golang】高并发下TCP常见问题解决方案相关的知识,希望对你有一定的参考价值。

参考技术A 首先,看一下TCP握手简单描绘过程:

其握手过程原理,就不必说了,有很多详细文章进行叙述,本文只关注研究重点。
在第三次握手过程中,如果服务器收到ACK,就会与客户端建立连接,此时内核会把连接从半连接队列移除,然后创建新的连接,并将其添加到全连接队列,等待进程调用。
如果服务器繁忙,来不及调用连接导致全连接队列溢出,服务器就会放弃当前握手连接,发送RST给客户端,即connection reset by peer。

在linux平台上,客户端在进行高并发TCP连接处理时,最高并发数量都要受系统对用户单一进程同时打开文件数量的限制(这是因为系统每个TCP都是SOCKET句柄,每个soker句柄都是一个文件),当打开连接超过限制,就会出现too many open files。
使用下指令查看最大句柄数量:

增加句柄解决方案

redis实现高并发下的抢购/秒杀功能

redis实现高并发下的抢购/秒杀功能

抢购/秒杀是如今很常见的一个应用场景,那么高并发竞争下如何解决超抢(或超卖库存不足为负数的问题)呢?

常规写法:

查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但是在判断库存是否大于0处,如果在高并发下就会有问题,导致库存量出现负数

这里我就只谈redis的解决方案吧…

我们先来看以下代码(这里我以laravel为例吧)是否能正确解决超抢/卖的问题:

A代码

<?php
$num = 10;   # 系统库存量
$user_id = 

以上是关于【golang】高并发下TCP常见问题解决方案的主要内容,如果未能解决你的问题,请参考以下文章

python 如何解决高并发下的库存问题??

高并发下缓存失效问题及解决方案

高并发下缓存失效问题及解决方案

redis实现高并发下的抢购/秒杀功能

[第27期] 通过轻量分布式锁解决高并发下数据竞争的一种思路

大型网站高并发下前后端常用解决方案总结java