通道層類型

可以選擇多種後端,以滿足複雜性,吞吐量和可擴展性的不同折衷。你也可以寫你自己的後端,如果你願意;他們確認的規範被稱為 ASGI。可以使用任何符合ASGI的信道層。

Redis

Redis 層是運行 Channels 的推薦後端,因為它支持單個 Redis 服務器上的高吞吐量以及在分片模式下對一組 Redis 服務器運行的能力。

要使用 Redis 層,只需從 PyPI 安裝它 (它放在一個單獨的包,因為我們不想強制依賴於 redis-py 主安裝):

pip install -U asgi_redis

默認情況下,它將嘗試連接到 localhost:6379 的 Redis 服務器,但是你可以用 hosts 再複寫它的 config:

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "asgi_redis.RedisChannelLayer",
        "ROUTING": "???",
        "CONFIG": {
            "hosts": [("redis-channel-1", 6379), ("redis-channel-2", 6379)],
        },
    },
}

分片

分片模型基於一致性散列 - 特別是 response channels 被散列,用於選擇接口服務器和 worker 都將使用的單個 Redis 服務器。

對於正常信道,由於任何工作者都可以服務任何信道請求,所以消息簡單地在所有可能的服務器之間分佈,工作者將選擇單個服務器來收聽。注意,如果你運行的 Redis 服務器比 worker 多,很可能有些服務器沒有工作線程監聽它們;我們建議您始終為每個 Redis 服務器至少有十個工作線程,以確保良好的分發。然而,工作者將定期(每五秒左右)改變服務器,因此排隊的消息應該最終得到響應。

請注意,如果更改分片服務器集,您需要在任何工作之前重新啟動所有接口服務器和具有新集的工作線程,並且任何正在傳輸的消息都將丟失(即使有持久性,也會有)。一致性哈希模型依賴於具有相同設置的所有運行的客戶端。任何配置錯誤的接口服務器或工作程序將刪除部分或全部消息。

RabbitMQ

RabbitMQ layer is comparable to Redis in terms of latency and throughput. It can work with single RabbitMQ node and with Erlang cluster.

You need to install layer package from PyPI:

pip install -U asgi_rabbitmq

To use it you also need provide link to the virtual host with granted permissions:

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "asgi_rabbitmq.RabbitmqChannelLayer",
        "ROUTING": "???",
        "CONFIG": {
            "url": "amqp://guest:guest@rabbitmq:5672/%2F",
        },
    },
}

This layer has complete documentation on its own.

IPC

IPC 後端使用 POSIX 共享內存段和信號量,以允許同一機器上的不同進程相互通信。

由於它使用共享內存,它不需要任何額外的服務器運行來工作,並且快於任何基於網絡的通道層。但是,它只能在同一台機器上的進程之間運行。

警告

IPC 層只在同一台機器上的進程之間進行通信,雖然最初可能會試圖運行一組具有自己的基於IPC的進程集合的機器,但這會導致組無法正常工作;發送到群組的事件將只會轉到在同一台計算機上加入群組的那些頻道。此後端僅用於單機部署。

In-memory

in-memory 層僅在單個進程中運行協議服務器和工作服務器時有用;最常見的情況是``runserver``,其中服務器線程,這個通道層和工作線程都在同一個 python 進程內共存。

它的路徑是``asgiref.inmemory.ChannelLayer``。如果你嘗試和``runworker``使用這個通道層,它將退出,因為它不支持跨進程通信。

編寫自定義通道層

The interface channel layers present to Django and other software that communicates over them is codified in a specification called ASGI.

Any channel layer that conforms to the ASGI spec can be used by Django; just set BACKEND to the class to instantiate and CONFIG to a dict of keyword arguments to initialize the class with.