源码阅读 - asgiref.server 模块
asgiref.StatelessServer 类实现了 server 的基类,处理 instance creation/ pooling, exception handling. 子类继承后覆盖 handle() 方法,调用 get_or_create_application_instance(unique-id, scope)
获取或新建 app instance, 你可以向这个 app instance put message.
如果设定了 max_application
, 且到达了上限,最老的那个会被干掉。
有个 coroutine 默认每 100ms 找 error, 并打印到 console. 可以重写 application_exception()
做其它的事情。
协议阅读 - ASGI
ASGI 全称是 Asynchronous Server Gateway Interface,它旨在为 Python 网络服务器程序提供一套标准接口。它规定了一套服务器交互和运行 app 程序的 API。
它的前身是 WSGI,WSGI 只关注 HTTP 的请求响应模型,另外 WebSocket 也不包括在里面。ASGI 有着更大的野心。
ASGI 有两个组件:Protocol Server & Application。前者处理 sockets,转为 pre-event messages;后者存活在 protocol server, per socket 中,处理 event messages。app 不像 WSGI 那样是个 callable,而是一个 …
read more数据库 2PL v/s MVCC
解决幻读 (Phantom Read) 的方法有两种:2PL 与 MVCC。
幻读 = 范围查询出现了别的事务的数据。
2PL (Two-Phase Locking) 是传统做法,通过 shared(read) 和 exclusive(write) lock 序列化事务调度。例如 MySQL(InnoDB),在底层它为每行或一段行获取 shared physical lock 。它使用的技术叫 next-key locking. 假设事务在 MySQL 中使用 Serializable isolation level,事务B 中的插入会因为事务A获得了锁,导致事务B等待(超时后回滚)
MVCC 的假设是 Readers 和 Writers 互相不应该堵塞,所以它的方法是乐观的:冲突就让它发生 …
read more协议阅读 - ASGI 如何处理 HTTP 和 WebSocket 数据
这篇 spec 规定了 ASGI 如何处理 HTTP 和 Websocket 数据。
- HTTP:
- http connection scope 包含的信息:type=http, http_version=1.0/1.1/2, method, scheme, path, query_string, root_path, headers, client=[host, port], server=[host, port]
- http request: type=http.request, body, more_body=true/false.
- restart start: type=http.response.start …