最近刚试长连接,我使用django的channels(3.0.4)版本,数据量大的情况下会出现ChannelFull的情况,
之前找资料说是需要从InMemoryChannelLayer改成RedisChannelLayer,但我本身用的就是redischannellayer,并且调整了MAX_CONNECTIONS为None,设置CAPACITY为2048,还是会出现这样的问题。
我想问下该如何避免和解决这个问题?
或者我还应该调整服务器的哪些参数么?(服务器使用supervisor+nginx+daphne配置)
附代码如下:
@csrf_exempt
@async_to_sync
async def async_receive_live_like_msg(request):
"""
主方法
"""
try:
# 校验数据正确性
params, data = common_valid_and_get_data(request)
# 获取当前房间通道
room = data.get('room')
channel_name = await get_channel_name_by_code(room)
if not channel_name:
logger.info('推送点赞信息给房间{}时检测到当前房间未连接'.format(room))
return JsonResponse({'result': 1, 'msg': 'room{} is not connected!'.format(room)})
# 处理消息
msgs, count_sum = await async_trans_save_live_msg(params, data)
logger.info('给房间{}推送信息{}'.format(room, like_msgs))
await channel_layer.send(channel_name, {
"type": "group_message",
"message": json.dumps({'msgs': msgs}),
})
return JsonResponse({'result': 1, 'msg': 'success'})
except Exception as e:
logger.error(e)
return JsonResponse({'result': 2, 'errorMsg': str(e)})
class AsyncConsumer(AsyncWebsocketConsumer):
async def connect(self):
await self.accept()
async def disconnect(self, close_code=None):
...
async def group_message(self, event):
"""
消息推送
"""
logger.info('room: {}推送消息到本房间: {}'.format(self.room_code, event.get('message')))
await self.send(text_data=json.dumps({
'result': 1,
**json.loads(event.get('message'))
}))