首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >队列工作器的同步访问

队列工作器的同步访问
EN

Stack Overflow用户
提问于 2013-03-01 01:42:16
回答 2查看 531关注 0票数 1

我目前正在编写一个服务,它使用蒸汽Web爬行DotA 2匹配。因为我希望我的解决方案是可伸缩的,所以我希望允许同时缓冲和处理爬行作业。这就是为什么一想到排队:

所有组件都应该能够在不同的计算机/VM上运行(没有内存内同步或进程间同步)。爬行工作可能是这样的:

代码语言:javascript
运行
AI代码解释
复制
Job 1: Crawl match 1234 with options ABC
Job 2: Crawl match 2345 with options BCD

由于数据的性质,指向同一匹配的多个作业可能会排队(例如,两个玩家玩同一游戏)。因此,我需要一些队列无法提供的同步机制(爬虫不能尝试同时写入相同匹配的数据)。

我的实际问题是:是否有一种模式可以用于同步需要访问相同数据的队列工作人员?

我想到的一种方法是引入另一种服务,允许爬行器进行Lock匹配(这需要在从数据库读取或写入匹配数据之前完成):

但这将带来一大堆新的问题和要求:

  • 如何缩放控制器?
  • 如果控制器崩溃了呢?
  • 如果队列工作人员不解锁匹配怎么办?
  • ..。

如果感兴趣的话,下面是我可能使用的技术:

  • 队列:用于Windows的服务总线
  • 服务:.NET Web
  • DB: Server 2012
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-01 02:29:59

这听起来像是预订系统,网上订票系统有这样的问题-

代码语言:javascript
运行
AI代码解释
复制
user asks for tickets
system offers specific tickets
user thinks a while and maybe pays, during that think time system cannot offer tickets to anyone else
eventually user buys, rejects or maybe just times out
system updates ticket availability

问:在您的系统中,如果两个参数相同的爬虫同时进行搜索,如果它们不能同时更新结果,这是否是一个问题?我问这个问题的原因是,我认为爬行操作本身类似于用户思考时间,这是一个长时间运行的操作,在其持续时间内持有数据库锁是不合理的。

我建议的方案是乐观锁定,通过数据库和数据库的超越,因此不需要单独的控制器--您的DB是一个单一的故障点,最终是一个可伸缩性的瓶颈,但是您可以通过对DB进行一些分区来解决这个问题。

你需要某种控制器。但不一定是单身。同样,通过数据库锁来中介实例。我看到的大问题是可靠地捕捉失败的爬虫。在“蓝天”场景中,很容易维护运行爬虫的DB表。在我看来,失败的情况是非常棘手的。

我不知道诀窍是否是对数据库进行分区,每个分区对应于一个带有自己控制器的“工作组”。只要控制器是活动的,它就可以启动工作,并对查询进行监管,这样就不会在其工作组中出现重复的情况。在完成任何爬虫时,都会有“就绪”消息排队,结果合并服务会将数据从分区中提取到主服务器。

票数 1
EN

Stack Overflow用户

发布于 2013-03-01 06:23:47

如果需要将队列中的一组/一组消息关联起来,则可以使用会话进行关联。此外,使用具有多个订阅的单个主题可以根据订阅上设置的不同筛选器对消息进行分区。以下信息可能会有所帮助:

  1. (从我的博客) http://abhishekrlal.wordpress.com/2012/02/07/enterprise-integration-patterns-with-service-bus-part-1/
  2. http://code.msdn.microsoft.com/windowsazure/Brokered-Messaging-Session-41c43fb4

您可能需要将上述示例中的引用更新到AzureSDK1.8,因为这正是支持Windows服务总线1.0的地方。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15154645

复制
相关文章
AQS队列同步器
​ AQS主要用来构建锁或者其他同步器组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成想获取资源的线程的排队工作。其主要使用方式是继承,子类通过继承它并实现它的抽象方法来管理同步状态,在管理同步状态的时候就需要对同步状态变量(int成员变量)进行修改,为了安全的修改同步状态变量就可以使用AQS已经提供的三个方法(getState(),setState(int newState),compareAndSetState(int expect, int update))修改。AQS的子类被推荐定义为自定义同步组件的静态内部类,同步器自身没有实现任何同步接口,可以支持共享式地获取同步状态,可以方便实现不同的同步组件(ReentrantLock,ReentrantReadWriteLock和CountDownLatch等)。
doper
2022/09/26
2050
AQS抽象队列同步器
AbstractOwnableSynchronizer AbstractQueuedLongSynchronizer AbstractQueuedSynchronizer 通常地:AbstractQueuedSynchronizer简称为AQS
鱼找水需要时间
2023/02/16
2690
AQS抽象队列同步器
Java并发之-队列同步器AQS
AQS是AbstractQueuedSynchronizer的简称,是用来构建锁或者其他同步组建的基础框架,它使用一个 int 类型的成员变量来表示同步状态,通过内置的FIFO(先进先出)队列来完成资源获取和排队的。
胖虎
2019/06/26
4500
Java并发之-队列同步器AQS
Java 并发:队列同步器是什么?
Java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略,但是与Lock相比synchronized还是存在一些缺陷的:虽然synchronized提供了便捷性的隐式获取锁释放锁机制(基于JVM机制),但是它却缺少了获取锁与释放锁的可操作性,可中断、超时获取锁,且它为独占式在高并发场景下性能大打折扣。
二哥聊运营工具
2021/12/17
3320
Java 并发:队列同步器是什么?
JUC解析-AQS-抽象队列同步器
2.独占锁exclusive是一个悲观锁。保证只有一个线程经过一个阻塞点,只有一个线程可以获得锁。
Java宝典
2021/04/22
3570
JUC解析-AQS-抽象队列同步器
并发学习笔记15-队列同步器
队列同步器AbstractQueuedSynchronizer(AQS)是用来构建锁或者其他同步组件的基础框架。该类也是其他许多同步类的基类,许多同步器通过AQS很容易构造出来(如,ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWriteLock等,Java6以前的版本还包含SynchronousQueue和FutureTask)。
WindCoder
2020/01/22
4070
GCD队列、同步异步
GCD的队列有两种,一种是串行队列,一种是并发队列。 串行队列: 任务按往队列里的添加先后顺序执行,先进先出(FIFO),前一个任务执行完再开始执行下一个任务。(我们开发中主线程队列就是一个串行队列,所以我们经常在主线程写的一般任务(不考虑多线程),都是顺序执行的)。 注意一个串行队列里只有一个线程。 并发队列: 任务会在这个队列中新开线程,并发同时执行(无序)。 我们GCD使用常伴有dispatch_sync和dispatch_async,这就是同步执行和异步执行。 同步和异步 同步执行:任务都在当前线程
清墨
2018/05/07
1.8K0
浅析Java中的Lock和AbstractQueuedSynchronizer 1.Lock接口2.队列同步器3.自定义同步组件4.同步器队列的实现
在之前的文章中我也曾经介绍过Lock,像ReentrantLock(可重入锁)和ReentrantReadWriteLock(可重入读写锁),这些所我们在说的时候并没有详细的说明它们的原理,仅仅说明了它们的用法,今天我们就来看一看Java中Lock底层的原理,下一篇文章将分析ReentrantLock和ReentrantReadWriteLock! 以下大概就是我们本篇文章的内容: Lock的方法摘要 队列同步器 自定义同步组件(类似ReentrantLock的简单结构) 同步器队列的实现 三种不同的同步
MindMrWang
2018/04/16
6420
浅析Java中的Lock和AbstractQueuedSynchronizer	  1.Lock接口2.队列同步器3.自定义同步组件4.同步器队列的实现
工作队列
API 路径:kernel/kernel/workqueue.c; kernel/include/linux/workqueue.h
开源519
2020/07/28
1K0
RabbitMQ的工作队列
通过程序执行发现生产者总共发送 4 个消息,消费者 1 和消费者 2 分别分得两个消息,并且是按照有序的一个接收一次消息
小熊学Java
2023/07/16
2360
RabbitMQ的工作队列
彻底理解Java并发:AQS抽象队列同步器
AQS,即 AbstractQueuedSynchronizer,抽象队列同步器,它是是一个集同步状态管理、线程阻塞、线程释放及队列管理功能与一身的同步框架。其核心思想是当多个线程竞争资源时会将未成功竞争到资源的线程构造为 Node 节点放置到一个双向 FIFO 队列中。被放入到该队列中的线程会保持阻塞直至被前驱节点唤醒。值得注意的是该队列中只有队首节点有资格被唤醒竞争锁
栗筝i
2022/12/01
7710
rabbitmq消息队列——"工作队列"
二、”工作队列” 在第一节中我们发送接收消息直接从队列中进行。这节中我们会创建一个工作队列来分发处理多个工作者中的耗时性任务。 工作队列主要是为了避免进行一些必须同步等待的资源密集型的任务。实际上我们
用户1141560
2017/12/26
1.5K0
rabbitmq消息队列——"工作队列"
RabbitMQ工作队列
RabbitMQ工作队列(Work Queues)是一种常见的消息模式,也称为任务队列(Task Queue),它用于在多个消费者之间分发耗时的任务。工作队列模式通过将任务封装为消息,并将其发送到一个中心队列,然后多个消费者同时从队列中获取任务进行处理。
堕落飞鸟
2023/05/16
3200
使用工作队列管理器(一)
工作队列管理器是的一项功能,使能够通过以编程方式将工作分配给多个并发进程来提高性能。在引入工作队列管理器之前,可能已经使用 JOB 命令在应用程序中启动多个进程并使用自定义代码管理这些进程(以及任何导致的故障)。工作队列管理器提供了一个高效且直接的 API,使能够卸载流程管理。
用户7741497
2022/08/03
4370
使用工作队列管理器(二)
可以指定要使用的并行worker jobs的数量,也可以使用默认值,这取决于机器和操作系统。此外,如果已创建类别,则可以指定应从中获取job的类别。
用户7741497
2022/08/03
5610
使用工作队列管理器(四)
通常,初始化一组工作程序,将工作项排队,然后等待工作程序完成工作项。但是,可能会遇到工作人员作业完成工作项所需的时间比预期更长的情况,或者无法将单个进程专门用于等待。因此,工作队列管理器使能够将工作队列与进程分离,然后将工作队列附加到同一进程或不同的进程。
用户7741497
2022/08/03
3780
Work Queues的轮询分发(工作队列/任务队列)
  工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进=程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。
别团等shy哥发育
2023/02/25
6390
Work Queues的轮询分发(工作队列/任务队列)
使用工作队列管理器(三)
一个类别是一个独立的worker jobs池。当初始化一组worker jobs时,可以指定提供worker的类别。如果集合中的任何worker jobs在执行work项时请求额外的worker jobs,则新的worker jobs来自同一类别。
用户7741497
2022/08/03
4750
rabbitmq工作队列
下面 我们可以试着将多个消费者共同消费一个队列的情况!我们发送多条消息到消息队列里中!
止术
2020/09/15
4970
Juc并发编程06——深入剖析队列同步器AQS源码
原来lock,unlock等核心方法都是通过sync来实现的。而sync其实是它的一个内部类。
半旧518
2022/10/26
2690
Juc并发编程06——深入剖析队列同步器AQS源码

相似问题

队列的同步访问

24

如何同步内核工作队列线程?

32

用于工作线程队列的最轻同步原语

93

队列的同步

22

队列的同步

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档