标签: message-queue

ASP.NET - 新应用程序的最佳队列系统

我的组织正准备实现一个新系统,这是一个asp.net应用程序.该应用程序将具有由网站启动的大量离线工作队列.此队列将包含不同类型的活动,最好是在XML消息中.想想电子邮件通知,计划任务等等.

过去,组织可能会使用MSMQ来完成此任务.但是,他们认为MSMQ是老派(我部分同意他们),所以我们将进行架构审查以确定"最佳"解决方案.

在我看来,有一些潜在的选择:

1.坚持使用最新版MSMQ的新实现 - 不理想,但是已知的产品.
2.使用Windows Workflow Foundation,我从其他一些开发人员那里听说过这种情况.
3.开发自定义数据库解决方案.

我错过任何明显的解决方案吗?理想情况下,这将是Microsoft产品,但实际上只需要在Microsoft中心的商店中工作.

我关注以下内容:
1.易于实施和维护
2.一个解决方案将会存在一段时间
3.能够处理大量的行,其中包含中等大小的XML数据
4.绝对可靠的队列系统,快速更新(多个实用程序进程可能会从队列中取出记录来处理它们).

.net queue msmq message-queue workflow-foundation

9
推荐指数
1
解决办法
4665
查看次数

排队系统 - 启动多个员工的好方法是什么?

  • 如何为面向队列的系统设置一个或多个工作脚本?
  • 你如何安排启动 - 并在必要时重新启动 - 工作脚本根据需要?(我正在考虑像init.d /,基于Ruby的'上帝',DJB的Daemontools等等工具)

我正在开发一个异步队列/工作系统,在这种情况下使用PHP和BeanstalkdD(虽然实际的语言和守护进程并不重要).任务本身并不太难 - 将带有命令和参数的数组编码到JSON中,以便通过Beanstalkd守护程序进行传输,在工作脚本中将它们拾取以根据需要对其进行操作.

还有许多其他类似的队列/工作人员设置,例如Starling,Gearman,亚马逊的SQS以及其他更像"企业"的系统,如IBM的MQ和RabbitMQ.如果你运行像Gearman或SQS这样的东西 - 你如何启动和控制工作池?问题出在最初的工人启动上,然后能够添加额外的额外工作人员,随意关闭它们(虽然我可以通过队列发送消息来关闭它们 - 只要一些'观察者'不会自动关闭它们重启它们).这不是一个PHP问题,它是关于设置一个或多个进程在启动时运行的直接Unix进程,或者向池中添加更多工作程序.

一个bash脚本循环的脚本已经到位-这将调用PHP脚本,然后收集并从队列中运行的任务,偶尔出来才能够清理自己(也可以暂停失败了几秒钟,或通过计划的事件).这样可以正常工作,并且在此基础上构建工作进程根本不会非常困难.

获得一个好的工作者控制器系统是关于灵活性,在机器启动时自动启动一个或两个,并且能够在队列繁忙时从命令行添加更多,在不再需要时关闭额外的东西.

queue worker-process message-queue gearman amazon-sqs

9
推荐指数
1
解决办法
3177
查看次数

如何有选择地删除AMQP(RabbitMQ)队列中的消息?

我想有选择地删除AMQP队列中的消息,甚至不读取它们.

方案如下:

发送方希望根据X类型的新信息到达的事实使类型X的消息到期.因为订阅者很可能还没有使用类型X的最新消息,所以发布者应该只删除以前的X类型消息并将最新的消息放入队列中.整个操作应该对订户透明 - 实际上他应该使用像STOMP这样简单的东西来获取消息.

如何使用AMQP做到这一点?或者它可能在另一个消息传递协议中更方便?

我想避免复杂的基础设施.所需的整个消息传递如上所述:一个队列,一个订阅者,一个发布者,但发布者必须能够临时删除给定条件的消息.

发布者客户端将使用Ruby,但实际上,一旦我发现如何在协议中执行它,我就会处理任何语言.

messaging message-queue amqp rabbitmq

9
推荐指数
3
解决办法
3万
查看次数

JMS消息重新传递延迟

我有一个JMS客户端,可以在收到消息时ssh到远程系统(并在那里做各种事情 - 与问题无关).数百个这样的消息可能会在很短的时间内到达,需要尽快处理.

但是,当收到消息时,某些远程系统也可能不可用,因此应将它们推迟到稍后(例如1小时左右).最好的解决方案是将消息放回队列并设置一些"延迟"值,这将告诉JMS代理不要在一小时内再次尝试传递消息.

什么不行:睡在接收线程中并在一小时后醒来.由于消息消费者池是有限的(例如,8个可用的连接),具有8个不可到达的系统将不必要地阻止整个处理,这是不可接受的.

对于这样的"延迟"值,我没有找到消息或队列本身的设置,它是否存在?

解决方法是使用第二个队列将消息存储到无法访问的系统,并单独处理这些消息.但它不是一个非常优雅的解决方案,需要额外的编程.也许有更好的方法.

jms message-queue openmq

9
推荐指数
2
解决办法
7853
查看次数

PHP的异步处理 - 每个作业一个工作者

考虑一个PHP Web应用程序,其目的是接受用户启动通用异步作业的请求,然后创建一个工作进程/线程来运行该作业.作业不是特别占用CPU或内存,但预计会经常阻塞I/O调用.每秒应该启动不超过一个或两个作业,但由于运行时间长,可能会同时运行许多作业.

因此,工作并行运行至关重要.此外,每个作业都必须由负责杀死挂起的工作人员,根据用户请求中止工作人员等的经理守护程序进行监控.

实现这样的系统的最佳方法是什么?我可以看到:

  1. 从经理那里分配一名工人 - 这似乎是最低级别的选择,我必须自己实施一个监控系统.Apache是​​Web服务器,因此看起来该选项需要通过FastCGI启动任何PHP工作程序.
  2. 使用某种作业/消息队列.(gearman,beanstalkd,RabbitMQ等) - 最初,这似乎是明显的选择.经过一些研究,我对所有选项感到困惑.例如,Gearman看起来像是为庞大的分布式系统而设计的,那里有一个固定的工人池......所以我不知道它是否适合我需要的东西(每个工作一个工人).

php asynchronous message-queue gearman task-queue

9
推荐指数
1
解决办法
5744
查看次数

分布式算法设计

我一直在读"算法入门",并开始在我脑海里浮现出一些想法和问题.最令我困惑的是你如何设计一种算法来安排分发队列中的项目/消息.

我的想法让我浏览维基百科,主题包括排序,消息队列,调度,分布式哈希表,等等.

场景: 假设你想要一个排队消息的系统(例如字符串或一些序列化对象).该系统的一个关键特性是避免任何单点故障.系统必须分布在某个集群中的多个节点上,并且必须始终(或尽可能最好)甚至集群中每个节点的工作负载以避免热点.

您希望避免使用主/从设计进行复制和扩展(没有单点故障).该系统完全避免写入盘并保持在存储器数据结构中.

由于这是一种某种类型的队列,系统应该能够使用不同的调度算法(FIFO,最早期限,循环等......)来确定在下一个请求中应该返回哪个消息,而不管哪个节点在请求所针对的集群.

我最初的想法, 我可以想象这将如何在一台机器上工作,但当我开始思考你如何分配像这样的问题,如:

我如何散列每条消息?

我怎么知道邮件发送到哪个节点?

我如何安排每个项目,以便我可以确定下一个应该返回哪个消息和哪个节点?

我开始阅读有关分布式哈希表以及像Apache Cassandra这样的项目如何使用某种一致性散列来分发数据但我认为,因为查询不会提供密钥,我需要知道下一个项目的位置并且只是提供它.这导致阅读有关对等协议以及它们如何跨节点处理同步问题.

所以我的问题是,你将如何处理上述问题,或者这是一个太过牵强,只是一个愚蠢的想法......?

只是一个概述,指针,不同的方法,陷阱和每个的好处.可能适用的技术/概念/设计/理论.基本上任何可以用来理解这样的东西可能有用的东西.

如果你想知道,不,我不打算实施这样的事情,它只是在阅读时突然出现在我脑海中(碰巧的是,当我读一本好书时,我会被狂野的想法分心).

UPDATE

另一个有趣的问题是分布式删除.我知道像Cassandra这样的系统已经通过实施HintedHandoff,Read Repair和AntiEntropy解决了这个问题,它似乎运行良好,但有没有其他(可行和有效)的方法解决这个问题?

algorithm p2p protocols distributed-computing message-queue

9
推荐指数
1
解决办法
1197
查看次数

需要一个线程安全的异步消息队列

我正在寻找一个Python类(最好是标准语言的一部分,而不是第三方库)来管理异步"广播风格"消息.

我将有一个线程将消息放入队列('putMessageOnQueue'方法不能阻止),然后多个其他线程将等待消息,可能会调用一些阻塞'waitForMessage'函数.当消息放在队列上时,我希望每个等待的线程都获得它自己的消息副本.

我查看了内置Queue类,但我不认为这是合适的,因为消费消息似乎涉及从队列中删除它们,因此只有一个客户端线程会看到每个.

这似乎应该是一个常见的用例,任何人都可以推荐一个解决方案吗?

python queue multithreading message-queue

9
推荐指数
1
解决办法
7653
查看次数

nodejs的工作队列?

我正在开始使用节点的集群API和mongoose为节点编写工作队列.

我注意到很多lib已经存在,但已经使用redis和forking.是否有充分的理由进行分叉而不是使用集群API?

编辑,现在我也发现:https://github.com/xk/node-threads-a-gogo - 太多的选择!

因为我已经使用了mongo,所以我宁愿不添加redis.此外,我的要求非常宽松,我希望持久性,但第一个版本可能没有它.

问题的第二部分:今天有哪些最稳定/最常用的nodejs工作队列库?

message-queue worker node.js

9
推荐指数
2
解决办法
2万
查看次数

如何使用RabbitMQ限制吞吐量?

问题在哪里:

我们使用RabbitMQ作为任务队列.其中一项具体任务 - 向Vkontakte社交网络发送通知.他们api限制每秒请求和此限制根据您的应用程序大小.只需3个电话就可以获得少于10万人的应用程序,依此类推.所以我们需要人为地限制对他们的服务请求.现在这个逻辑基于应用程序.这很简单,虽然每个队列只能使用一个工作人员,但只需设置睡眠(300毫秒)并保持冷静.但是当你应该使用N个工作者时,这种同步变得微不足道.

如何使用RabbitMQ限制吞吐量?

基于上面的故事.如果可能的话,设置预取大小不仅基于消息,而且基于此逻辑的时间可以非常简单.例如,"每次获取的qos到1条消息不会快于1次,以秒为单位"等等.

  1. 有这样的事吗?
  2. 可能是关于此的其他策略?

message-queue rabbitmq task-queue vk

9
推荐指数
1
解决办法
805
查看次数

通过log4net记录到运行时提供的TextWriter

我有一个消息处理程序,在Azure中运行以下签名:

public static void DispatchQueueMessage([QueueTrigger("bq")] string msg,
                                                             TextWriter tw)
Run Code Online (Sandbox Code Playgroud)

我想配置log4net以使用提供的TextWriter.

如果这一般不可能,我绝对会选择使用标准格式输出的单个ILog实例!


我最终做了(如下):

ILog log = LogManager.GetLogger(name);

var appender = new TextWriterAppender();  

appender.Writer = tw;
appender.Threshold = log4net.Core.Level.Debug;

DynamicPatternLayout layout = new DynamicPatternLayout();
layout.ConversionPattern = "%d [%t] %-5p %m%n";
layout.ActivateOptions();

appender.Layout = layout; 
appender.ActivateOptions();

((log4net.Repository.Hierarchy.Logger) log.Logger).AddAppender(appender);
Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();
hierarchy.Configured = true;
return log;
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

c# log4net message-queue azure

9
推荐指数
0
解决办法
1418
查看次数