问题标签 [message-queue]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
architecture - MSMQ 与临时表转储
我知道以前有人问过这个问题。但是环顾四周,我仍然无法决定我应该走哪条路线。这是我的场景,希望你能帮忙:
我们将拥有一系列 Web 服务,这些服务将按计划被数百个移动应用程序访问。这些服务将在设备上提供数据,其中包含进入设备和从设备返回的新信息。从设备返回的数据将需要更新一个中央 SQL 服务器数据库,该数据库还为多个桌面应用程序和一个网站提供数据。
为了减少这些服务的请求/响应时间,我们决定在事后处理来自设备的数据,要么将它们粘贴在 MSMQ 实例中,要么将序列化对象存储在临时数据存储中并拥有Windows 服务稍后处理它们。
所以这是我的选择,但除此之外,还有一些可能会帮助你们给我建议的事情:
- 从设备返回的数据不会以较小的消息包的形式返回,需要在服务器端订购。
- 我对 MSMQ 一无所知,但我以前写过 Windows 服务。尽管如果需要,我可以毫无问题地选择 MSMQ。
- 我想将设备的响应保留在某些地方,以防由于数据引起的某种原因处理失败。通过这种方式,我可以查询数据并查看是否存在问题,即设备允许用户添加评论,以扩展服务器端数据库中相关字段的长度。
有了这些信息,您认为值得我学习 MSMQ 还是我应该坚持使用更简单的解决方案?
克里斯。
windows-services - Microsoft 服务间通信问题
我目前正在构建两个 Windows 服务:
第一个从互联网连接获取消息并将这些消息插入数据库。这是为了快速稳定而设计的,不做任何其他处理
第二个对自上次运行以来到达的任何新消息执行批处理。
我正在尝试一种方法,以便第二个服务仅在准备好处理新消息时运行其批处理,并且如果第二个服务出错,则第一个服务将继续运行,反之亦然。目前它每 5 秒使用一次循环。
我目前正在考虑使用消息队列,其中第一个服务仅在队列为空时写入消息,第二个服务将查看队列是否包含任何消息,如果不进入异步等待直到消息到达然后删除消息并运行。因此,使用队列并不是真正的队列,而是作为一个二进制开关,当它的状态改变时会导致一个事件被触发到第二个服务。
我想有一种更好的方法可以做到这一点,我还没有遇到过有人可以指出我正确的方向吗?
ftp - 用于文件传输的 IBM MQ
我们面临着使用 IBM MQ over SFTP 进行文件传输的选择。我听说过这种方法的优点,但我从未见过有人真正将它用于大文件。
所以主要问题:IMB MQ 处理大文件(最大 100 MB)传输的能力如何?稳定吗?它是从大型机到 UNIX 服务器,如果它确实重要的话。
非常感谢。
queue - 排队系统 - 启动多个工人的好方法是什么?
- 您如何为面向队列的系统设置一个或多个工作脚本?
- 您如何根据需要安排启动 - 并在必要时重新启动 - 工作脚本?(我正在考虑诸如 init.d/、基于 Ruby 的“上帝”、DJB 的 Daemontools 等工具)
我正在开发一个异步队列/工作系统,在这种情况下使用 PHP 和BeanstalkdD(尽管实际的语言和守护进程并不重要)。任务本身并不太难——将带有命令和参数的数组编码为 JSON,以便通过 Beanstalkd 守护程序进行传输,然后在工作脚本中提取它们以根据需要对其进行操作。
还有许多其他类似的队列/工作者设置,例如Starling、Gearman、Amazon 的 SQS和其他更多面向“企业”的系统,例如 IBM 的 MQ 和 RabbitMQ。如果你运行 Gearman 或 SQS 之类的东西 - 你如何启动和控制工作池?问题在于最初的工人启动,然后能够添加额外的额外工人,随意关闭它们(尽管我可以通过队列发送消息以关闭它们 - 只要一些“观察者”不会自动重新启动它们)。这不是 PHP 问题,它是关于直接设置一个或多个进程以在启动时运行的 Unix 进程,或者向池中添加更多工作人员。
循环脚本的bash 脚本已经到位 - 这会调用 PHP 脚本,然后从队列中收集并运行任务,偶尔退出以便能够自行清理(它也可以在失败时暂停几秒钟,或通过计划的活动)。这很好用,在此基础上构建工作进程一点也不难。
获得一个好的工作控制器系统是关于灵活性的,在机器启动时自动启动一个或两个,并且能够在队列繁忙时从命令行添加更多,在不再需要时关闭额外的。
multithreading - 如何在不锁定的情况下将数据从一个线程输出到另一个线程?
我正在开发一个 DirectShow 应用程序。我遇到了一个死锁问题,这个问题似乎是由线程调用的回调函数中的获取锁引起的。这是我在 MSDN 论坛中提出的问题:
现在我必须避免在该线程中获取锁。但问题是,我必须将音频输出到另一个线程,我怎样才能将数据不加锁地放到另一个线程?
有人告诉我,我可以使用 win32 sdk 的 PostMessage 将数据发布到另一个线程。但是,为了得到消息,我必须运行一个 Windows 程序。我的程序是一个 Python C++ 扩展模块。添加循环来拉取消息可能非常困难。所以我认为另一种在线程之间传递数据而不锁定的方法。(其实……生产者线程不能被锁定,但是消费者线程可以做到。)
锁还是不锁,这是个问题。
那么问题来了怎么办?
谢谢。
- - - 编辑 - - -
我想我知道为什么会出现死锁,那可能不是 DirectShow 的问题。
主线程是Python自己的,调用stop,即持有GIL。并在线程返回中停止等待 DirectShow 的回调。但是回调获取 GIL。
看起来像这样
Main(Hold GIL) -> Stop(Wait callback) -> Callback(Wait GIL) -> GIL(Hold by Main thread)
该死的!这就是为什么我不太喜欢多线程的原因。不管怎样,谢谢你的帮助。
java - 如何测试消息队列客户端?
我正在开发一个 java 消息队列客户端(beanstalk),现在我的测试看起来像这样:
我读到您不应该测试实际队列本身,因为它不是我编写的代码,但我确实编写了客户端代码——有没有更好的方法来编写这个?我真的需要测试来保证自己,但除了风格之外,为我的 CI 设置也是一件痛苦的事情。
queue - 多级队列设计
我正在设计一个系统来处理外部 Web 服务。该服务限制在特定时间段 (T) 内可以发出的请求数。该系统允许对一定数量的请求 (R) 进行批处理。该服务支持一定数量的操作 (O)。
我的代码将处理来自用户的未知数量的请求(此时我真的不知道,可能是每天一个请求,可能是每秒数千个请求,但我需要在假设每秒数千个的情况下构建它)。这些结果将在数据库中缓存一段时间。当数据库记录过期时,系统将需要再次从 Web 服务请求数据。
我只能通过一个IP地址和一个帐户访问Web服务(没有作弊,每种操作类型获得一个帐户,或每种操作类型一台机器)。该系统将(希望)全部在单个服务器上运行。
我正在尝试做的(断断续续思考了几个星期,但没有任何我喜欢的结果)是想出一个系统,其中:
- 重复请求被合并(重复意味着它们具有相同的请求数据)
- 用户请求优先于系统请求
- 可以将系统请求更改为用户请求(数据库更新在队列中,并且用户正在请求相同的数据)
- 如果没有针对特定操作的 R 用户请求,则其余部分取自系统请求
- 用户请求的处理顺序与它们进入的顺序相同(除了一旦处理了用户请求,就会处理相同类型的 R 个请求)。
因此,例如,T 为 1 秒,R 为 3,O 为 2。以下请求进入系统:
处理重复项后,您将得到以下信息:
请求应按以下顺序处理:
我认为可能会有 3-7 种操作类型。某些操作类型会比其他操作类型有更多的请求。系统请求的数量可能会大于用户请求。
是否有处理此类问题的通用方法?模式还是技术?我是不是想多了(不幸的是,在它启动并运行之前我无法获得使用统计信息,我什至无法合理地猜测它们会是什么)?
我试图避免的主要事情是:
- 让系统请求处理用户请求(系统请求可能会等待数周,用户请求必须尽快处理)
- 在数据缓存在数据库中期间,没有两次发出相同的请求
memcached - 基于 Memcache 的消息队列?
我正在开发一个多人游戏,它需要一个消息队列(即,消息输入、消息输出、没有重复或删除的消息,假设没有意外的缓存驱逐)。以下是我知道的基于内存缓存的队列:
- MemcacheQ: http: //memcachedb.org/memcacheq/
- 八哥:http ://rubyforge.org/projects/starling/
- 已缓存:http : //www.marcworrell.com/article-2287-en.html
- 麻雀:http ://code.google.com/p/sparrow/
我从这篇博文中了解了 memcache 队列的概念:
所有消息都以整数作为键保存。有一个键具有下一个键,另一个键具有队列中最旧消息的键。要访问这些,增量/减量方法用作其原子,因此有两个充当锁的键。它们递增,如果返回值为 1,则进程拥有锁,否则它继续递增。一旦该过程完成,它会将值设置回 0。简单但有效。一个警告是整数会溢出,因此一旦我们接近该限制,就有一些逻辑将使用的键设置为 1。由于增量操作是原子的,因此只有在使用两个或更多内存缓存(用于冗余)时才需要锁定,以保持它们同步。
我的问题是,是否有可以在 App Engine 上运行的基于 memcache 的消息队列服务?
linux - 为可以具有多个实例的应用程序的消息队列创建唯一键
我制作了一个 Linux CUI 应用程序,它通过消息队列在进程之间进行通信。
只要是单例就没有问题。但是,当同一个应用程序有多个实例时,队列中的消息会被发送到错误的实例。
我知道这可以通过给 msgget 函数一个唯一的键来避免。使用 ftok() 创建密钥,但由于变量相同,它们会产生相同的密钥。
有人可以指导我如何为每个实例设置一个唯一的密钥吗?
我现在唯一的想法是随机分配给 ftok 的变量,我知道这不可能。
c# - 消息队列错误:找不到能够读取消息的格式化程序
我正在将消息写入 C# 中的消息队列,如下所示:
我正在尝试阅读以下消息:
但是,我收到一条错误消息,上面写着:“找不到能够读取此消息的格式化程序。”
我究竟做错了什么?