Hello everyone. I am seeking some help with Django Channels and Redis.
I have a Django app running on Heroku. This app is rather simple: a Daphne server, a background worker and a scheduling beat worker (the last two, using Celery). I noticed I hit *very often* Redi's MaxClientsError (every 15 minutes or so) despite using the non-free plan of RedisCloud on Heroku, which has the following parameters: Memory Size = 100 MB, Dedicated DB = 4, Connections = 256. I was using the free plan for a while with 30 connections, but the MaxClientsError was popping all the time. Thus I increased to 256 connections, but since I have more bakground tasks, I hit again the error. In the stacktrace below, you can see the problem occurs within djangochannelsrestframework code. Line 233, there is this: for group_name in group_names: async_to_sync(channel_layer.group_send)(group_name, message) But we never managed to understand if that was the cause of the error. Is that way of doing the reason for opening so many connections ? My app is not a chat. It has only background tasks that discover some data remotely, and send them through websockets for a kind of "live events RSS". Wouldn't it be better to use something like: async2sync = async_to_sync(channel_layer.group_send) for group_name in group_names: async2sync(group_name, message) Thanks a lot in advance!!! --- My conf is the following: Django==2.2.* channels==2.2.* channels-redis==2.3.* daphne==2.3.* CHANNEL_LAYERS = { "default": { "BACKEND": "channels_redis.core.RedisChannelLayer", "CONFIG": { "hosts": [os.environ.get('REDISCLOUD_URL', 'redis://localhost:6379')], }, "symmetric_encryption_keys": [SECRET_KEY], }, } And the stacktrace: MaxClientsError: ERR max number of clients reached File "arcsecond/activities/tasks/archive_datarows.py", line 65, in parse_archive_latest_rows target_name=row.target_name) File "django/db/models/manager.py", line 82, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) File "django/db/models/query.py", line 422, in create obj.save(force_insert=True, using=self.db) File "django/db/models/base.py", line 741, in save force_update=force_update, update_fields=update_fields) File "django/db/models/base.py", line 790, in save_base update_fields=update_fields, raw=raw, using=using, File "django/dispatch/dispatcher.py", line 175, in send for receiver in self._live_receivers(sender) File "django/dispatch/dispatcher.py", line 175, in <listcomp> for receiver in self._live_receivers(sender) File "djangochannelsrestframework/observer/observer.py", line 154, in post_save_receiver **kwargs File "djangochannelsrestframework/observer/observer.py", line 221, in post_change_receiver **kwargs File "djangochannelsrestframework/observer/observer.py", line 233, in send_messages async_to_sync(channel_layer.group_send)(group_name, message) File "asgiref/sync.py", line 79, in __call__ return call_result.result() File "concurrent/futures/_base.py", line 425, in result return self.__get_result() File "concurrent/futures/_base.py", line 384, in __get_result raise self._exception File "asgiref/sync.py", line 95, in main_wrap result = await self.awaitable(*args, **kwargs) File "channels_redis/core.py", line 559, in group_send async with self.connection(self.consistent_hash(group)) as connection: File "channels_redis/core.py", line 742, in __aenter__ self.conn = await self.pool.pop() File "channels_redis/core.py", line 49, in pop conns.append(await aioredis.create_redis(**self.host, loop=loop)) File "aioredis/commands/__init__.py", line 178, in create_redis loop=loop) File "aioredis/connection.py", line 129, in create_connection await conn.auth(password) File "aioredis/util.py", line 48, in wait_ok res = await fut -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscr...@googlegroups.com. To post to this group, send email to django-users@googlegroups.com. Visit this group at https://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/dfe526ee-cd75-4481-9029-6f423996116d%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.