我在Heroku上使用Django/Celery和CloudAMQP插件.
在我的设置文件中,如果我设置BROKER_POOL_LIMIT为除了以外的任何值None,我很快就会超过我的CloudAMQP连接限制6.
我想知道为什么我会有比我指定的连接更多的连接BROKER_POOL_LIMIT以及如何设置BROKER_POOL_LIMIT一个大于None不超过连接限制的值.如果它有用,这是我的配置文件中指定的工作进程类型
worker python manage.py celery worker -B --loglevel=info
我在Heroku上运行Flask应用程序(在免费套餐上),并在使用apply_async安排任务时遇到麻烦.如果我安排了两个以上的任务,我得到一个长堆栈跟踪,但有异常:
AccessRefused(403,U "ACCESS_REFUSED - 访问虚拟主机 'rthtwchf' 交换 'celeryresults' 拒绝了用户rthtwchf'",(40,10), 'Exchange.declare')
奇怪的是前两个任务(在重新启动我的所有进程之前)似乎总是没有问题.
搜索引擎侦探一点点让我/sf/ask/1475033451/这使得它看起来像一个权限问题,但我假设Heroku CloudAMPQ服务已经处理好了.
任何建议表示赞赏!
禁用八卦,混杂和心跳对我的芹菜工人有什么影响?
为了减少发送到CloudAMQP的消息数量,使其不超出免费计划的范围,我决定遵循以下建议。因此,我使用了选项--without-gossip --without-mingle --without-heartbeat。从那时起,我一直在所有芹菜项目中默认使用这些选项,但是我不确定是否有我不知道的副作用。
请注意:
期待在AppHarbor上构建一个在MVC4上运行的Web应用程序.为了响应性和性能,将通过在消息队列上放置消息来处理稍长的运行任务(通常,生成/发送电子邮件,调整图像大小,支付事务处理等).
在那里的某个地方也会有一个或多个工人,将消息出列并处理因此需要处理的任何内容.中央排队机制是RabbitMQ,特别是通过AppHarbor提供的托管CloudAMQP服务.从理论上讲,这种架构可以通过增加更多工作人员来实现"无限"的可扩展性
现在,为了良好的架构,可测试性等,我想将RabbitMQ置于一个或多个易于模拟的接口之后.在定义这些接口时,我需要考虑一些注意事项.
好的,太好了,所以这很多东西.在这个项目之前没有任何RabbitMQ的经验,我被一些额外的要点所困扰.
在构建类似的应用程序时,是否有其他人已经完成了同样的挑战?您对消息队列的接口的体系结构和实际实现有什么建议吗?我只是对此感到神经质,还是我的担忧值得肯定?
如果重要,我的当前消息传递需求由单向消息覆盖,除了在处理完成后确认收到的消息之外,不需要任何响应.
感谢您的任何见解!
由于 Celery 文档建议使用 Flower 进行监控,我试图让它与托管的 RabbitMQ 提供程序 (CloudAMQP) 一起使用
celery flower --broker=amqp://username:password@lemur.cloudamqp.com/vhost --broker_api=https://lemur.cloudamqp.com/api/ --basic_auth=username:password
Run Code Online (Sandbox Code Playgroud)
我可以在 CloudAMQP 管理控制台中看到如下所示的 500 内部服务器错误,这似乎表明密码错误,而我却没有。
The server encountered an error while processing this request:
{error,function_clause,
[{rabbit_auth_backend_internal,check_password,
[<<"password">>,
<<>>]},
{rabbit_auth_backend_internal,internal_check_user_login,2},
{rabbit_access_control,'-check_user_login/2-fun-0-',4},
{lists,foldl,3},
{rabbit_mgmt_util,is_authorized,4},
{webmachine_resource,resource_call,3},
{webmachine_resource,do,3},
{webmachine_decision_core,resource_call,1}]}
Run Code Online (Sandbox Code Playgroud)
那么如何使用 cloudamqp 监控 celery 呢?
有没有更好的解决方案(监控/任务队列)?
我有一个Django应用程序,我已经部署到Heroku.这个应用程序使用Celery进行消息排队,我使用RabbitMQ在本地运行它,没有任何意外.
不幸的是,当我将这个宝宝部署到Heroku时,我发现RabbitMQ插件不可用,而且我必须使用CloudAMQP.CloudAMQP和Heroku的文档让我相信我可以使用Celery(即使他们推荐Pika),但是当我尝试部署时,我的调度程序和工作进程都会出现粗糙的连接错误.以下是确切的错误:
2012-07-09T16:46:22+00:00 app[scheduler.1]: [2012-07-09 11:46:22,234: ERROR/Beat] Celerybeat: Connection error: [Errno 111] Connection refused. Trying again in 2.0 seconds...
2012-07-09T16:46:23+00:00 app[worker.1]: [2012-07-09 11:46:23,852: ERROR/MainProcess] Consumer: Connection Error: [Errno 111] Connection refused. Trying again in 2 seconds...
Run Code Online (Sandbox Code Playgroud)
我应该注意我的Heroku配置变量有一个CLOUDAMQP_URL,所以这不应该是一个问题?
如果有人使用CloudAMQP和Django/Heroku,可以给我一些关于如何确保Celery可以与经纪人联系的指导,我将不胜感激.
有没有人成功让MassTransit与AppHarbor和CloudAMQP合作?
我正在忍受它的一段时间.
我让发布者(网站)发送消息,但服务器(后台工作者)似乎没有接收它们.
我担心的一件事是MT需要rabbitmq方案,而CloudAMQP将方案设置为amqp.
我在配置总线时交换了方案(从amqp到rabbitmq)并注意到消息地址中的方案是rabbitmq,这很有意义,因为我更换了它们.但我想知道他们是否必须是服务器的amqp来接他们?
这是一个简单的消息,我已发送,它到达RabbitMQ但服务器没有提取它.
message_id: 08cf2cbc-5b4f-14dd-1231-381f8b520000
delivery_mode: 2
headers:
Content-Type: application/vnd.masstransit+json
Payload
614 bytes
Encoding: string
{
"destinationAddress": "rabbitmq://98eabe2a-aae8-464c-8555-855518dd87d0_apphb.com:*********@lemur.cloudamqp.com/98eabe2a-aae8-464c-8555-855518dd87d0_apphb.com/Messages.Product:ProductCreatedEvent",
"headers": {},
"message": {
"id": "dd6ecfaa-60d2-4cd4-8cd6-a08a00e872fb"
},
"messageType": [
"urn:message:Messages.Product:ProductCreatedEvent"
],
"retryCount": 0,
"sourceAddress": "rabbitmq://98eabe2a-aae8-464c-8555-855518dd87d0_apphb.com:**********@lemur.cloudamqp.com/98eabe2a-aae8-464c-8555-855518dd87d0_apphb.com/enterprise_web"
}
Run Code Online (Sandbox Code Playgroud)
谢谢,乔
编辑:感谢Carl指出网址中的密码
我在 Heroku 上运行的 Django 站点使用 CloudAMQP 来处理其计划的 Celery 任务。CloudAMQP 注册的消息比我的任务多得多,我不明白为什么。
例如,在过去的几个小时里,我将运行大约 150 个计划任务(两个每分钟运行一次,另一个每五分钟运行一次),但是 CloudAMQP 控制台的消息计数增加了大约 1,300。
我的相关 Django 设置:
BROKER_URL = os.environ.get("CLOUDAMQP_URL", "")
BROKER_POOL_LIMIT = 1
BROKER_HEARTBEAT = None
BROKER_CONNECTION_TIMEOUT = 30
CELERY_ACCEPT_CONTENT = ['json',]
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_RESULT_EXPIRES = 7 * 86400
CELERY_SEND_EVENTS = False
CELERY_EVENT_QUEUE_EXPIRES = 60
CELERY_RESULT_BACKEND = None
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
Run Code Online (Sandbox Code Playgroud)
我的档案:
web: gunicorn myproject.wsgi --log-file -
main_worker: python manage.py celery worker --beat --without-gossip --without-mingle --without-heartbeat --loglevel=info
Run Code Online (Sandbox Code Playgroud)
查看 Heroku 日志,我只能看到我期望的正在运行的计划任务的数量。
大多数情况下,RabbitMQ 概览图往往如下所示:
我对 …
我们必须为我们的ROR Application实现排队系统.我们已经评估了以下选项:
Amazon SQS:高可用性但性能相对较慢.需要持续的poling.
CloudAmqp:看起来很有希望但对这种支持感到怀疑.
EC2上的RabbitMq设置:需要用户带宽来管理设置,如果设置中出现某些问题,可能会导致停机.
目前,没有任何专门的团队/人员可以全职管理设置,因此在Ec2上实施我们自己的RabbitMq设置可能会在出现问题时导致停机.
我想知道考虑这种情况是我们最好的选择吗?