这可能是我第十次实施这样的事情,而且我从未对我提出的解决方案百分百满意.
使用mysql表而不是"正确"的消息传递系统的原因很有吸引力,主要是因为大多数应用程序已经将一些关系数据库用于其他东西(对于我一直在做的大多数事情,它往往是mysql),而很少有应用程序使用消息传递系统.此外 - 关系数据库具有非常强大的ACID属性,而消息传递系统通常没有.
第一个想法是使用:
create table jobs( id auto_increment not null primary key, message text not null, process_id varbinary(255) null default null, key jobs_key(process_id) );
然后入队看起来像这样:
insert into jobs(message) values('blah blah');
出列似乎是这样的:
begin; select * from jobs where process_id is null order by id asc limit 1; update jobs set process_id = ? where id = ?; -- whatever i just got commit; -- return (id, message) to application, cleanup after done
表和入队看起来不错,但出队有点困扰我.回滚的可能性有多大?还是被封锁了?我应该用什么键来制作O(1)-ish?
或者,我正在做什么更好的解决方案?
有谁知道一个可以监视beanstalkd队列的应用程序?我正在寻找显示管和工作统计数据的东西,并允许您检查细节.
我对语言/平台并不是很挑剔,只是想在我自己编写之前知道是否有某些东西.
我无法理解以下代码是如何运行的.为什么"1"在"b"之后但"h"在"3"之后?订单应该是:a,b,1,2,h,3?有些文章说"事件循环队列"和"作业队列"之间的区别导致了以下输出.但是怎么样?我已经阅读了ECMAScript 2015 - 8.4工作和工作队列的规范,想知道Promise'job是如何工作的,但这让我更加困惑.有人能帮我吗?谢谢!
var promise = new Promise(function(resolve, reject) {resolve(1)});
promise.then(function(resolve) {console.log(1)});
console.log('a');
promise.then(function(resolve) {console.log(2);});
setTimeout(function() {console.log('h')}, 0);
promise.then(function(resolve) {console.log(3)});
console.log('b');
// a
// b
// 1
// 2
// 3
// h
Run Code Online (Sandbox Code Playgroud)
我知道Promise是异步的,但setTimeout(..)异步操作的回调总是在Promise的异步操作之后.为什么?
我需要一个可以通过Internet控制的作业队列管理器.它应该能够执行和停止进程,检查它们的状态(理想情况下通知并在进程退出时执行一些代码),响应命令并且还能够向服务器报告.
背景:我有一个GWT应用程序,允许创建在云实例(目前是EC2)上执行的作业.我想将"作业包"(进程操作的数据等)推送到S3,启动Linux EC2实例(或使用已经运行的实例),并告诉实例上的作业管理器执行该作业(可能与其他工作平行).然后,它应该从S3中提取"作业数据包",运行对该数据进行操作的进程,并使用一些信息(例如退出代码,stdout,stderr)向运行GWT应用程序的服务器部分的服务器报告.如果我必须将stdour/err写入进程中的文件并读取该文件,那也没关系.
我真的希望管理器"关闭"它运行的进程,这意味着我想避免使用来自JDK的Runtime.exec之类的东西.如果我以Quartz为例,似乎我必须这样做.
我很好,两个方向的调用都是异步的.只要我可以在我的GWT服务器端轻松地为它构建一个接口(例如,通过SSL对servlet的HTTP请求将是非常简单的),我对任何合理的调用技术都很好.
作业管理员不需要非常复杂的排队系统.顺序或并行运行几个进程应该没问题.确定一个进程在其生命周期内收到的计算时间是多么好(AFAIK,这可能具有挑战性).
我还没有找到任何现有的软件,包括http://java-source.net/open-source/job-schedulers.我怀疑我可能需要围绕一个职业经理建立一个RPC接口(当然还有身份验证等); 也许使用像Apache Commons Exec这样的东西.在这种情况下,我更喜欢Java或Python作为工作管理器部分.
我很乐意听到前一个或后一个场景的建议!
我有一个包含~50K行的数据库表,每行代表一个需要完成的工作.我有一个程序从数据库中提取作业,完成工作并将结果放回到数据库中.(这个系统现在正在运行)
现在我想允许多个处理任务来完成工作,但要确保没有任务完成两次(作为性能问题而不是这会导致其他问题).因为访问是通过sproce进行的,我现在的目的是用看起来像这样的东西替换所说的sproce
update tbl
set owner = connection_id()
where available and owner is null limit 1;
select stuff
from tbl
where owner = connection_id();
Run Code Online (Sandbox Code Playgroud)
BTW; 工作人员的任务可能会在获得工作和提交结果之间失去联系.此外,我不认为DB甚至会接近瓶颈,除非我把那部分搞砸了(每分钟约5个工作)
这有什么问题吗?有一个更好的方法吗?
注意:"数据库作为IPC反模式"在这里只是略微适用,因为1)我没有做IPC(没有生成行的过程,它们现在都已存在)和2)描述的主要抱怨反模式是因为进程等待消息导致数据库上出现不必要的负载(在我的情况下,如果没有消息,一切都可以在一切都完成时关闭)
我正和一位朋友一起开展一个项目,我们一直在使用Resque来处理来自rails应用程序内部数据输入的各种命令.
我们一直在搞乱使用Sidekiq的想法,因为它是多线程的,不会是内存占用,也不需要为每个工作者启动ruby env.
我希望能够从实时使用Resque和Sidekiq的人那里收集一些想法和意见,并解释其中的差异.
那么,Sidekiq对Resque的利弊是什么?
我目前面临一个问题,我可以肯定有一个正式名称,但是我不知道该在网上搜索什么。我希望如果我描述问题和解决方案时想到的,有人能够告诉我设计模式的名称(如果有一个与我要描述的内容相匹配的设计模式)。
基本上,我想拥有一个工作队列:我有多个创建工作的客户端(发布者),以及许多处理这些工作的工人(消费者)。现在,我想将发布者创建的作业分发给各个使用者,这基本上可以使用几乎任何消息队列并在整个队列中实现负载均衡,例如使用RabbitMQ甚至MQTT 5。
但是,现在事情变得复杂了……每个工作都指向一个外部实体,例如一个用户。我想要的是按顺序处理单个用户的作业,但并行处理多个用户的作业。我不要求用户X的作业始终去工作者Y,因为无论如何它们都应按顺序处理。
现在,我可以使用RabbitMQ及其一致的哈希交换来解决此问题,但是当新的工作人员进入集群时,我就会进行数据竞赛,因为RabbitMQ不支持重新定位已经在队列中的作业。
MQTT 5也不支持:在这里,这个想法被称为“粘性共享订阅”,但这不是官方的。它可能是MQTT 6的一部分,也可能不是。谁知道。
我也看过NSQ,NATS和其他一些经纪人。他们中的大多数甚至都不支持这种非常特定的情况,而那些确实使用一致哈希的情况,则存在前面提到的数据竞速问题。
现在,如果代理在作业到达后不将作业分类到队列中,而是跟踪某个特定用户的作业是否已经在处理中,则问题将消失:如果这样,它将延迟所有其他作业该用户,但其他用户的所有作业仍应处理。使用RabbitMQ等人无法做到这一点。
我很确定我不是唯一拥有用例的人。例如,我可以想到用户将视频上传到视频平台,尽管上传的视频是并行处理的,但单个用户上传的所有视频都是按顺序处理的。
因此,简而言之:我所形容的名字是用一个普通名字吗?诸如分布式作业队列之类的东西?具有任务相似性的任务调度程序?还是其他?我尝试了很多术语,但没有成功。这可能意味着没有解决方案,但是如上所述,很难想象我是这个问题上唯一的人。
有什么想法我可以寻找吗?并且:是否有实现此目的的工具?有协议吗?
PS:仅使用预定义的路由密钥是不可行的,因为用户ID(我在这里只是作为一个示例)基本上是UUID,因此可以有数十亿个,因此我需要更多动态的东西。因此,一致性哈希基本上是正确的方法,但是如上所述,为了避免数据争用,分发必须逐个进行而不是预先进行。
distributed design-patterns message-queue dispatcher job-queue
我有一个Grails应用程序,它具有一些计算密集型优化,运行时间约为5分钟(可能更多).目前,我正在主请求线程中执行这些操作,即请求返回需要5分钟.它起作用,但从可用性的角度来看当然是可怕的.
那么以异步方式实现它的最佳方法是什么?我假设一个ThreadPoolExecutor必须参与,但我如何开始和访问它?我可以将其建模为Grails服务吗?或者一份工作(虽然这些工作只是为了重复工作)?
另外,处理工作状态的最佳方法是什么?通过一个标志或者DB中的全新类?让浏览器显示一个微调器并继续轮询,直到状态发生变化?
(这里提到的关于这个主题的大多数问题都有点陈旧,我想知道那些年来Node生态系统发生了哪些变化.)
我基本上是想在node.js的应用程序中实现一个作业队列.我听说过Sidekiq在Ruby世界中的行动以及它的工作有多棒,并且想知道节点中是否存在类似的东西.
工作人员将使用Javascript编写,因此它不必是多语言(如果是,那就很好,但绝对不是必需的).
一个很大的优点是可视化当前正在运行的作业,失败的作业等.
你们用的是什么?你知道哪些lib /服务符合这些要求?
job-queue ×10
javascript ×2
beanstalkd ×1
concurrency ×1
database ×1
dispatcher ×1
distributed ×1
es6-promise ×1
event-loop ×1
grails ×1
groovy ×1
gwt ×1
locking ×1
monitoring ×1
mysql ×1
node.js ×1
python ×1
resque ×1
rpc ×1
ruby ×1
sidekiq ×1
sql ×1