websockets "lag" 当收到大量消息时可以吗?

Can websockets "lag" when a lot of messages are received?

我正在尝试使用 asynciowebsocket 创建一个脚本,它应该连接到 4-5 个加密货币交易所 websockets 并从这些交易所实时接收交易。我的代码有效而且非常简单,看起来像这样:

import asyncio
import websockets
import json

subscriptions = ['btcusdt@trade', 'ethusdt@trade', 'bchusdt@trade', 'xrpusdt@trade', 'eosusdt@trade', 'ltcusdt@trade', 'trxusdt@trade', 'etcusdt@trade', 'linkusdt@trade', 'xlmusdt@trade', 'adausdt@trade', 'xmrusdt@trade', 'dashusdt@trade', 'zecusdt@trade', 'xtzusdt@trade', 'bnbusdt@trade', 'atomusdt@trade', 'ontusdt@trade', 'iotausdt@trade', 'batusdt@trade', 'vetusdt@trade', 'neousdt@trade', 'qtumusdt@trade', 'iostusdt@trade', 'thetausdt@trade', 'algousdt@trade', 'zilusdt@trade', 'kncusdt@trade', 'zrxusdt@trade', 'compusdt@trade', 'omgusdt@trade', 'dogeusdt@trade', 'sxpusdt@trade', 'kavausdt@trade', 'bandusdt@trade', 'rlcusdt@trade', 'wavesusdt@trade', 'mkrusdt@trade', 'snxusdt@trade', 'dotusdt@trade', 'defiusdt@trade', 'yfiusdt@trade', 'balusdt@trade', 'crvusdt@trade', 'trbusdt@trade', 'yfiiusdt@trade', 'runeusdt@trade', 'sushiusdt@trade', 'srmusdt@trade', 'bzrxusdt@trade', 'egldusdt@trade', 'solusdt@trade', 'icxusdt@trade', 'storjusdt@trade', 'blzusdt@trade', 'uniusdt@trade', 'avaxusdt@trade', 'ftmusdt@trade', 'hntusdt@trade', 'enjusdt@trade', 'flmusdt@trade', 'tomousdt@trade', 'renusdt@trade', 'ksmusdt@trade', 'nearusdt@trade', 'aaveusdt@trade', 'filusdt@trade', 'rsrusdt@trade', 'lrcusdt@trade', 'maticusdt@trade', 'oceanusdt@trade', 'cvcusdt@trade', 'belusdt@trade', 'ctkusdt@trade', 'axsusdt@trade', 'alphausdt@trade', 'zenusdt@trade', 'sklusdt@trade']

async def connect():
    while True:
        async with websockets.client.connect('wss://fstream.binance.com/ws/trade') as ws:
        
                tradeStr = {"method": "SUBSCRIBE", "params": subscriptions, 'id': 1}
                await ws.send(json.dumps(tradeStr))

                while True:
                    try:
                        msg = await asyncio.wait_for(ws.recv(), 5)
                        message = json.loads(msg)

                        try:    
                            print(message)
                        except Exception as e:
                            print(e)

                    except asyncio.TimeoutError:
                        break


asyncio.get_event_loop().run_until_complete(connect())

在上面的示例中,我正在连接到 Binance,并且正在接收所有可用市场的交易。我这样做是为了一次进行更多的交流,但是只要我每秒收到大量消息,问题也会发生。

每条消息看起来像这样{"rate": "xx", "market": "xx", "amount": "xx", "side": "xx"},非常小。

我注意到的一个大问题是脚本 运行 一段时间后,我开始收到越来越少的消息,很多消息会在很多秒后出现,我什至没有收到还有很多其他人,好像他们迷路了或者好像连接冻结了。

现在,我知道这不是一个非常具体的问题,但这里可能有什么问题?

有没有可能当websockets每秒收到很多消息的时候会出现这种问题?我试图从我的本地和 vps 测试这个系统,在这两种情况下我都遇到了同样的问题。这可能是资源问题吗?或者它最有可能与服务器有关,而不是我的客户端?我试着尽可能具体,如果需要我可以更详细。 我读到 websockets 将收到的消息存储在缓冲区中。问题是否可能出在缓冲区已满? 任何类型的建议都将不胜感激!

根据您的解释和我的经验,似乎与资源管理有关,是的,如果您每秒收到大量消息,WebSockets 会受到影响,是的,这会导致您的服务器出现问题。为什么?因为缓冲区当然是有限的,而且同时处理所有这些消息的可用内存量也是有限的,正如他们在 WebSocket(version 8.1) 的官方文档中提到的那样,我认为你的问题这是你 opening a lot number of connections at the same time and this causes memory exhaustion 当然这取决于消息的大小和你的服务器的资源,这可以很容易地测试你可以尝试使用 2 VPS 和不同数量的资源,如果2台服务器有不同的时间 运行 进入那个状态肯定是资源问题之一(我认为这应该是预期的结果更少的资源应该首先 运行 进入问题并且资源意味着内存)。以下是 WebSockets 库的官方文档的一些链接,其中提到了由内存引起的这些问题以及优化内存使用的方法。希望这对你有帮助。

Memory Usage Optimizations