为什么注意channels

目前om系统采用django(version=1.5),大部分是通过同步方式对rpc、db等进行操作。 
channels具有以下优缺点:

优点

  • channels是django的插件,能很好的兼容目前om的技术选型
  • 具备异步执行、简单的任务队列管理(生产-消费模式)、websocket,满足目前om的需求
  • 将websocket和http进行高度整合,可进行分组,使用非常简便

缺点

  • 需要升级om的django版本 v1.5 -> v1.10
  • 风险点: 中版本跨越幅度大,settings.py配置文件已修改
  • 已有api若需使用channels需要修改api层的代码和前端代码
  • 只是在api层由view调用改为分发到channels内调用
  • 需新加软件(channels和所需其他包, redis)
  • 代码可读性变差,可忽略 
    ...

 



使用示例



 


django目录内新建所需文件:django_dir|-- routing.py ==>相当于channels的urls.py|-- consumers.py ==>相当于channels的views.py |-- asgi.py ==>相当于channels的wsgi.py routing.py :定义通道之间的映射 consumers.py :任务到来后的消费函数

   
 
 
 新增settings.py的配置settings.py: INSTALLED_APPS =[...,'channels',] CHANNEL_LAYERS ={"default":{"BACKEND":"asgi_redis.RedisChannelLayer",==>指定消息中间件,这里选择redis"CONFIG":{"hosts":[os.environ.get('REDIS_URL','redis://localhost:6379')],},"ROUTING":"xxx.routing.channel_routing",==>指定routing.py的channels列表},}

   
 
 
 routing.py:# -*- coding:utf-8 -*-from channels.routing import routefrom chan import consumer #导入处理函数channel_routing =[ route("work-run", consumer.worker_calling),#任务通道 route("websocket.connect", consumer.ws_connect), route("websocket.receive", consumer.ws_message), route("websocket.disconnect", consumer.ws_disconnect),]

   
 
 
 consumer.py# -*- coding:utf-8 -*- import timefrom django.http importHttpResponsefrom channels.handler importAsgiHandlerfrom channels.sessions import channel_sessionfrom channels importGroup@channel_sessiondef ws_connect(message): message.channel_session['room']='default'Group('default').add(message.reply_channel) message.reply_channel.send({"text":"This is a message from server"})def worker_calling(message): arg = message.content.get('arg')#获取传递参数#这里进行rpc调用、db读写Group('default').send({'data':data})#调用websocket返回结果

   
 
 
 view.pydef worker(request): arg = request.DATA.get('arg')Channel('work-run').send({'arg':arg})#将任务分发给channels的work-run,这里异步执行returnHttpResponse('worker running!')#任务分发后直接返回响应

 



过程



 


1、web端打开的时候建立并维护websocket连接2、web端通过标准的http发起一个任务给后端3、后端收到任务后将耗时任务分发给channels并立刻返回4、channels执行任务,执行完成后通过websocket通知web端