首页 > 其他分享 >aiohttp unix socket 启动简单说明

aiohttp unix socket 启动简单说明

时间:2024-03-22 09:01:39浏览次数:35  
标签:web socket aiohttp server unix timeout path

aiohttp 官方推荐了不少部署模式,以下是关于unix socket 部署的简单说明

参考配置

  • web.py
from aiohttp import web
import argparse
parser = argparse.ArgumentParser(description="aiohttp app")
parser.add_argument('--path')
async def hello(request):
    return web.Response(text="Hello, world")
if __name__ == '__main__':
    args = parser.parse_args()
    app = web.Application()
    app.add_routes([web.get('/', hello)])
    # 核心是path
    web.run_app(app,path=args.path)
  • 启动
python tests/web.py    --path=demo.sock

访问

  • curl 模式格式
curl --unix-socket demo.sock  http://localhost/
  • 实际访问
    推荐基于Supervisord的多集成模式,可以运行多个unix socket 这样可以提高系统资源利用率
    nginx 参考配置
http {
  upstream aiohttp {
    # fail_timeout=0 means we always retry an upstream even if it failed
    # to return a good HTTP response
 
    # Unix domain servers
    server unix:/tmp/web_1.sock fail_timeout=0;
    server unix:/tmp/web_2.sock fail_timeout=0;
    server unix:/tmp/web_3.sock fail_timeout=0;
    server unix:/tmp/web_4.sock fail_timeout=0;
 
    # Unix domain sockets are used in this example due to their high performance,
    # but TCP/IP sockets could be used instead:
    # server 127.0.0.1:8081 fail_timeout=0;
    # server 127.0.0.1:8082 fail_timeout=0;
    # server 127.0.0.1:8083 fail_timeout=0;
    # server 127.0.0.1:8084 fail_timeout=0;
  }
}

Supervisord

[program:aiohttp]
numprocs = 4
numprocs_start = 1
process_name = web%(process_num)s
 
; Unix socket paths are specified by command line.
command=/path/to/web.py --path=/tmp/web_%(process_num)s.sock
 
user=nobody
autostart=true
autorestart=true

aiohttp 对于unix socket 的处理

  • aiohttp/web.py
    可以看到如path 不为空,aiohttp 在sites 就会添加unix socket,同时还会判断是否是多个
 if path is not None:
            if isinstance(path, (str, os.PathLike)):
                sites.append(
                    UnixSite(
                        runner,
                        path,
                        ssl_context=ssl_context,
                        backlog=backlog,
                    )
                )
            else:
                for p in path:
                    sites.append(
                        UnixSite(
                            runner,
                            p,
                            ssl_context=ssl_context,
                            backlog=backlog,
                        )
                    )
  • UnixSite 处理
    start 方法中通过asyncio创建的unix_server
async def start(self) -> None:
    await super().start()
    loop = asyncio.get_event_loop()
    server = self._runner.server
    assert server is not None
    self._server = await loop.create_unix_server(
        server,
        self._path,
        ssl=self._ssl_context,
        backlog=self._backlog,
    )

说明

为了提高系统的性能基于unix socket 是一个很不错的选择,也是不少项目优先选择

参考资料

https://docs.aiohttp.org/en/stable/deployment.html
http://supervisord.org/
aiohttp/web.py
aiohttp/web_runner.py

标签:web,socket,aiohttp,server,unix,timeout,path
From: https://www.cnblogs.com/rongfengliang/p/18087758

相关文章

  • SpringBoot建立websocket连接
    介绍WebSocket协议是一种基于TCP的协议,用于在客户端和服务器之间建立持久连接,并且可以在这个连接上实时地交换数据。WebSocket协议有自己的握手协议,用于建立连接,也有自己的数据传输格式。当客户端发送一个WebSocket请求时,服务器将发送一个协议响应以确认请求。在握手期间,......
  • 在非标准Spring组件中(比如websocket)注入Spring管理bean的方法
    privatestaticUserMapperuserMapper;@AutowiredpublicvoidsetUserMapper(UserMapperuserMapper){WebSocketServer.userMapper=userMapper;}WebSocketServer是通过JavaWebSocketAPI创建的,并且由于@ServerEndpoint不是Spring的标准组件注解,直......
  • socket 技术是干什么的?底层原理是什么?
    Socket技术是一种通信机制,用于实现不同计算机之间的网络通信和同一计算机内不同进程之间的进程间通信。它是一种抽象层,使得不同操作系统和编程语言的程序能够在网络上相互通信。底层原理方面,Socket技术基于网络协议栈和操作系统提供的网络编程接口。当程序使用Socket技术......
  • Socketserver模块
    Socketserver模块socketserver主要是针对服务端来做的,所以对于客户端代码,并没有太多的改变网络协议的最底层就是socket,基于原有socket模块,又封装了一层,就是socketserversocketserver为了实现tcp协议,server端的并发首先,你必须通过子类化BaseRequestHandler类并重......
  • SocketIO高性能事件驱动设计探索
    来源:https://segmentfault.com/a/1190000021554678?utm_source=tag-newest背景SocketIO原生基于NodeJS实现的Web长连接技术方案,H5原生场景下通常使用websocket作为基础协议进行网络通信(客户端支持多语言),SocketIO对于长连接场景下的业务形态进行了很多方面的抽象和实现,比如:命名空......
  • C++ Qt开发:QUdpSocket实现组播通信
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QUdpSocket组件实现基于UDP的组播通信。组播是一种一对多的通信方式,允许一个发送者将数......
  • 为什么面试官都爱问websocket?
    什么是webSocket?WebSocket是一种在单个TCP连接上进行全双工通信的应用层协议,它弥补HTTP协议在持久通信能力上的不足,允许服务器主动向客户端推送数据,并且简化了客户端和服务器之间的数据交换。在WebSocket通讯中,浏览器和服务器只需完成一次握手,便可创建持久性连接。Web......
  • websocket相关
    一、websocket相关的计网知识点1.全双工,半双工,单工分别是什么意思它们三个其实指的是都是一种通信模式,是一个抽象概念,单工指的是信息是单通道单向的,信息只能从A传达到B,但是不能由B传达到A。比如广播站和收音机,收音机只能单方面接受广播站的信息。半双工则是单通道双向的,信息可以从......
  • Swoole 源码分析之 WebSocket 模块
    首发原文链接:Swoole源码分析之WebSocket模块大家好,我是码农先森。Swoole源码分析之WebSocket模块引言WebSocket是一种在单个TCP连接上进行全双工通信的协议。它允许客户端和服务器之间进行实时数据传输。与传统的HTTP请求-响应模型不同,WebSocket可以保持双向通信......
  • C++ Qt开发:QTcpSocket网络通信组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QTcpSocket组件实现基于TCP的网络通信功能。QTcpSocket和QTcpServer是Qt中用于实现基于T......