funboost icon indicating copy to clipboard operation
funboost copied to clipboard

请问支持task按组限制qps吗

Open luodaoyi opened this issue 1 year ago • 15 comments

其实就是一个需求, 我们调用某saas服务, 最高100qps 超过就会封禁一直断时间, 而且此saas的接口的qps限制是共用的

也就是我们写的 一部分task 加起来的qps 不得超过100 但是我们又得让他尽量靠近100 这样可以最大化利用资源

文档我看了两遍 但是好像没有 按组 限制qps的

恳请解答 感谢作者开源,优秀项目

luodaoyi avatar Aug 05 '22 02:08 luodaoyi

反正celery是不支持此功能的, celery只能单个task限速 没有全局或者分组限速

luodaoyi avatar Aug 05 '22 02:08 luodaoyi

自己在文档搜索分布式控频,这个框架很容易测试,qps很容易从页面看到,也可以控制台看到,自己写个10行demo验证很容易把。

框架支持单个进程的消费者控频,也支持跨机器消费控频。控频针对的是一个函数。不同的函数之间的qps设置互不干扰

ydf0509 avatar Aug 05 '22 04:08 ydf0509

funboost 没有函数组的概念,没有组的概念。例如函数fa和fb,你想控制fa和fb总qps为10,那是做不到的。只能每个函数设置5qps,或者4 +6,3+7

ydf0509 avatar Aug 05 '22 06:08 ydf0509

我的意思是 不同功能的task 分成组 然后总体限制一个qps

luodaoyi avatar Aug 05 '22 06:08 luodaoyi

没有组的概念,qps是针对的一个函数,框架没有组这个概念。

ydf0509 avatar Aug 05 '22 06:08 ydf0509

没有组的概念,qps是针对的一个函数,框架没有组这个概念。

那不同的函数 可以用同一个 queue_name 吗

luodaoyi avatar Aug 05 '22 06:08 luodaoyi

funboost不同的函数不能用同一个queue,和celery不一样。是必须强制不一样的,每个函数用不同的队列,这样做是为了可以获取每个函数还有多少消息,每个函数都随时可以清空自己的队列消息,不影响别的函数的队列。

ydf0509 avatar Aug 05 '22 06:08 ydf0509

所有函数都用一个队列,你想清空某个函数的任务就无法做到了,也不能精确知道每个函数还有多少消息

ydf0509 avatar Aug 05 '22 06:08 ydf0509


Traceback (most recent call last):
 File "D:\sources\cv\supervise_pyworker\consumer.py", line 6, in <module>
   from funboost import boost, BrokerEnum, ConcurrentModeEnum
 File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\funboost\__init__.py", line 11, in <module>
   from funboost.assist.user_custom_broker_register import register_custom_broker
 File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\funboost\assist\user_custom_broker_register.py", line 2, in <module>
   from funboost.publishers.base_publisher import AbstractPublisher
 File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\funboost\publishers\base_publisher.py", line 22, in <module>
   from funboost.concurrent_pool import CustomThreadPoolExecutor
 File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\funboost\concurrent_pool\__init__.py", line 14, in <module>
   from .custom_evenlet_pool_executor import CustomEventletPoolExecutor
 File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\funboost\concurrent_pool\custom_evenlet_pool_executor.py", line 7, in <module>
   from eventlet import greenpool, monkey_patch, patcher, Timeout
 File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\eventlet\__init__.py", line 17, in <module>
   from eventlet import convenience
 File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\eventlet\convenience.py", line 7, in <module>
   from eventlet.green import socket
 File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\eventlet\green\socket.py", line 4, in <module>
   __import__('eventlet.green._socket_nodns')
 File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\eventlet\green\_socket_nodns.py", line 11, in <module>
   from eventlet import greenio
 File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\eventlet\greenio\__init__.py", line 3, in <module>
   from eventlet.greenio.base import *  # noqa
 File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\eventlet\greenio\base.py", line 32, in <module>
   socket_timeout = eventlet.timeout.wrap_is_timeout(socket.timeout)
 File "D:\sources\cv\supervise_pyworker\venv\lib\site-packages\eventlet\timeout.py", line 166, in wrap_is_timeout
   base.is_timeout = property(lambda _: True)
TypeError: cannot set 'is_timeout' attribute of immutable type 'TimeoutError'


跑demo一直报这个错误



luodaoyi avatar Aug 05 '22 06:08 luodaoyi

不支持python3.10,三方包的问题

ydf0509 avatar Aug 05 '22 06:08 ydf0509

所有函数都用一个队列,你想清空某个函数的任务就无法做到了,也不能精确知道每个函数还有多少消息

那这样的话 我感觉只能通过业务task 结合redis 来控制api调用的并发数了

luodaoyi avatar Aug 05 '22 06:08 luodaoyi

不支持python3.10,三方包的问题

最高支持py多少?

luodaoyi avatar Aug 05 '22 06:08 luodaoyi

eventlet不支持python3.10,支持3.9

ydf0509 avatar Aug 05 '22 06:08 ydf0509

eventlet 我昨天 celery还在用 支持3.10啊

luodaoyi avatar Aug 05 '22 06:08 luodaoyi

https://pypi.org/project/eventlet/0.33.1/
image celery 是尝试导入evetnlet,只有用ecventlet并发模式才会用到。我这是直接导入了,之后我要改成try import,用户不使用这个并发模式,就不直接导入了

ydf0509 avatar Aug 05 '22 06:08 ydf0509