Python协程安全问题:Context Variables

本文探讨了在Python协程中遇到的安全问题,特别是与Context Variables相关的问题。在高并发场景下,由于协程的特性,导致不同用户可能会重复发送相同的authentication。通过分析,确认问题是由于协程在I/O等待时共享变量所引起的。提出了三种解决方案,包括拆分接口、使用字典存储token以及利用Python 3.7+的ContextVar进行管理。
摘要由CSDN通过智能技术生成

Python协程安全问题:Context Variables

一、问题:

最近,同事压测遇到奇诡问题,添加好友功能在少量并发压测时没有问题;但是,增加并发压力后,出现增加好友失败。和开发定位问题时,发现是不同用户重复发送同一个authentication。只是,不能确定是开发的bug还是测试代码问题。

正常情况

在这里插入图片描述

错误情况

在这里插入图片描述

二、定位问题:
  1. tcpdump + wireshark 抓包
# tcpdump -i eth0 -nn ip src host node1 -w friends.cap

在这里插入图片描述

# strings ff1.pcap ff2.pcap|grep 'Bearer' >ff.txt
# grep 'Bearer' ff.txt|wc -l

总共抓取1000条增加好友数据

  1. python pyjwt 分析数据
import jwt

def from_jwt():
    player_ids = set()
    subs = set()
    with open('ff.txt', 'r') as fp:
        lines = fp.readlines()
        print(len(lines))
        for line in lines:
            bearer = line.strip().split()[-1]
            try:
                data = jwt.decode(bearer, algorithms=['HS256'], options={
   "verify_signature": False})
            except Exception as e:
                print(e)
            if data['playerId'] in player_ids:
                # 判断是否重复发送同一份 authentication
                print(data['playerId'])
            player_ids.add(data['playerId'])
            subs.add(data['sub'])
    return player_ids, subs
    

if __name__ == '__main__':
    ids, subs = from_jwt()
    print(len(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值