You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I propose nixing group_expiry from the Channel Layer specification. It should be an option specific to the Redis layer.
Redis has a global store of group memberships. When Daphne dies, the membership info remains in a Redis data structure -- it has "leaked." channels_redis can't delete leaked group memberships (by definition); so it deletes expired group memberships instead, as a proxy. From what I can tell, "expiry" was invented to handle "leaked memberships." By default, a membership "expires" one day after creation, according to the spec.
I also surmise from some Googling that group_expiry can sometimes defend the Redis layer against full buffers -- that's django/channels_redis#384, and group_expiry doesn't solve it in general.
channels_rabbitmq doesn't have "leaked memberships." Memberships are subscriptions, and they're stored as part of the Daphne-RabbitMQ ASGI connection. If Daphne dies, RabbitMQ cleans up the subscriptions.
And channels_rabbitmq defends against full buffers more sensibly: it gives each message a TTL, and it warns when dropping old messages. If the user forgets to group_discard(), the warning highlights the problem, and old messages don't pollute the buffer so a production server stays up.
The upshot: with channels_rabbitmq, group_expiry does no good. It only solves problems inherent to the Redis layer.
group_expiry certainly does harm. It stalls Websocket connections that are older than a day -- by default.
With the Redis layer, the group_expiry feature and default do more good than harm. With the Channels layer, the group_expiry does no good -- only harm.
Please remove group_expiry from the Channel Layer Specification. It belongs in the Redis layer only.
The text was updated successfully, but these errors were encountered:
See django/channels#1371 for rationale.
Also, document "normal channels" (i.e., job queues) and what users
should do if they want job queues.
[closes#18]
I maintain https://github.com/CJWorkbench/channels_rabbitmq.
I propose nixing
group_expiry
from the Channel Layer specification. It should be an option specific to the Redis layer.Redis has a global store of group memberships. When Daphne dies, the membership info remains in a Redis data structure -- it has "leaked."
channels_redis
can't delete leaked group memberships (by definition); so it deletes expired group memberships instead, as a proxy. From what I can tell, "expiry" was invented to handle "leaked memberships." By default, a membership "expires" one day after creation, according to the spec.I also surmise from some Googling that
group_expiry
can sometimes defend the Redis layer against full buffers -- that's django/channels_redis#384, andgroup_expiry
doesn't solve it in general.channels_rabbitmq
doesn't have "leaked memberships." Memberships are subscriptions, and they're stored as part of the Daphne-RabbitMQ ASGI connection. If Daphne dies, RabbitMQ cleans up the subscriptions.And
channels_rabbitmq
defends against full buffers more sensibly: it gives each message a TTL, and it warns when dropping old messages. If the user forgets togroup_discard()
, the warning highlights the problem, and old messages don't pollute the buffer so a production server stays up.The upshot: with
channels_rabbitmq
,group_expiry
does no good. It only solves problems inherent to the Redis layer.group_expiry
certainly does harm. It stalls Websocket connections that are older than a day -- by default.With the Redis layer, the
group_expiry
feature and default do more good than harm. With the Channels layer, thegroup_expiry
does no good -- only harm.Please remove
group_expiry
from the Channel Layer Specification. It belongs in the Redis layer only.The text was updated successfully, but these errors were encountered: