标签: queue

Postgres 更新...限制 1

我有一个 Postgres 数据库,其中包含有关服务器集群的详细信息,例如服务器状态(“活动”、“待机”等)。活动服务器在任何时候都可能需要故障转移到备用服务器,我不在乎特别使用哪个备用服务器。

我想要一个数据库查询来更改备用服务器的状态 - 只有一个 - 并返回要使用的服务器 IP。选择可以是任意的:因为服务器的状态随着查询而改变,所以选择哪个备用数据库并不重要。

是否可以将我的查询限制为一次更新?

这是我到目前为止所拥有的:

UPDATE server_info SET status = 'active' 
WHERE status = 'standby' [[LIMIT 1???]] 
RETURNING server_ip;
Run Code Online (Sandbox Code Playgroud)

Postgres 不喜欢这样。我可以做些什么不同的事情?

postgresql concurrency update queue

107
推荐指数
1
解决办法
10万
查看次数

Postgres中旧记录的自动老化(删除)

Postgres 是否有任何功能来支持老化的旧记录?

我想使用 Postgres 进行日志记录,作为一种队列,其中超过两周的记录(日志事件)会被自动删除。

postgresql delete queue

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

Postgres 侦听/通知为消息队列

有什么方法可以使用 Postgres 的监听/通知功能将消息传递到频道,并且只有一个监听器使用该消息?

这样做的目的是我有多个“工人”应用程序都在收听同一个 Postgres 频道。但我只希望通过通知渠道收到的每条消息完成一次工作。

如果侦听/通知不是 Postgres 中的正确功能,我应该使用单独的功能吗?

理想情况下,我希望在不使用任何其他扩展的情况下执行此操作。

postgresql event-notification queue

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

FIFO queue table for multiple workers in SQL Server

I was attempting to answer the following stackoverflow question:

After posting a somewhat naive answer, I figured I'd put my money where my mouth was and actually test the scenario I was suggesting, to be sure I wasn't sending the OP off on a wild goose chase. Well, it's turned out to be much harder than I thought (no surprise there …

sql-server locking queue

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

实现基于并发表的队列的最佳方法

我在 MySQL 中有一个表,表示要处理的链接队列。链接由外部应用程序一一处理,最后删除。这是一个大容量队列,我有处理应用程序的多个实例,分布在多个服务器上。

如何确保每条记录仅由一个应用程序选取?有没有办法标记/锁定记录?

现在,为了避免两个或多个获取相同的链接,我只允许每个实例获取一组特定的记录(基于其 ID 的 MOD),但这不是增加队列处理的透明方式只需添加新实例即可加快速度。

mysql queue

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

关于如何在 Service Broker 中组织队列的建议

我有一个服务代理应用程序,目前在两台服务器上有 5 或 6 个队列。

一般工作流程是:

服务器A

  • 用户填充一些表
  • 用户触发存储过程,将消息放入标头队列,指示有工作要做
  • Broker 从这个头队列中读取,并创建大量的消息发送到服务器 B

服务器B

  • 消息全部进入 1 个队列
  • 在这个队列中,消息被检查和解绑,有效载荷被运行,并且响应是从我们与之交互的另一组过程/表中收集的
  • 响应消息被创建并发送回服务器 A

服务器A

  • 响应消息进入一个特殊的队列,用于更新用户填充在顶部的表
  • 结束对话消息从发起者队列中读取并用于更新另一个跟踪标题记录进度的表(即处理的 100 条消息中的 50 条)
  • 当我们检测到头记录已被完全处理时,一条新消息被发送到另一个发送通知电子邮件的队列

我曾建议将其中一些队列合并到服务器 A 上,但我不确定最佳做法是什么。其中两个队列的消息处理量相对较高,而电子邮件队列的速度会非常慢。

我们在管理消息类型方面做得(我认为)做得很好,因此理论上我们可以将它们全部放入一个队列中,并且应用程序仍然可以运行。

是否有关于何时维护单独队列以及何时在这种情况下合并的最佳实践?

sql-server sql-server-2008-r2 service-broker queue

7
推荐指数
1
解决办法
2102
查看次数

数据库上没有活动的服务代理

我正在尝试设置查询通知,但是当我尝试创建队列和服务时,我收到错误消息“数据库中没有活动的 Service Broker。更改为包含 Service Broker 的数据库上下文。当我运行查询时

select is_broker_enabled from sys.databases where name='db01' 
Run Code Online (Sandbox Code Playgroud)

它返回 1 表示已在数据库上启用代理

这是我正在运行以创建队列和服务的 sql 命令...

CREATE QUEUE DeviceChangeMessages
CREATE SERVICE DeviceChangeNotifications ON QUEUE DeviceChangeMessages ([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);
Run Code Online (Sandbox Code Playgroud)

sql-server service-broker queue

7
推荐指数
1
解决办法
2592
查看次数

将表用作没有 sp_getapplock/sp_releaseapplock 的队列

我有一个需要执行的命令列表,所有这些命令都包含在我命名为 的表中myQueue。这个表有点独特,因为一些命令应该组合在一起,以便它们的执行按顺序执行,而不是并发执行,因为同时执行它们会导致不需要的数据工件和错误。因此,队列不能以典型的FIFO / LIFO方式分类,因为出队顺序是在运行时确定的。

总结一下:

  1. 命名的表myQueue将充当命令队列(其中出队顺序在运行时确定)
  2. 命令以随机方式添加到表中
  3. 命令可以归入,如果是,则必须由单个工作线程以有序、顺序的方式执行
  4. 当命令出列时,可以运行任意数量的工作线程
  5. 出列是通过 aUPDATE而不是 a执行的,DELETE因为此表用于所述命令的历史性能报告

我目前的方法是通过sp_getapplock/sp_releaseapplock调用使用显式互斥逻辑来迭代这个表。虽然这按预期工作,但该方法会生成足够的锁定,因此在任何给定时间都无法在队列上迭代大量工作线程。在阅读了 Remus Rusanu关于该主题优秀博客文章后,我决定尝试使用表格提示,希望可以进一步优化我的方法。

我将包含下面的测试代码,但总结一下我的结果,使用表提示和消除对sp_getapplock/ 的调用的缺点sp_releaseapplock最多会导致以下三种不良行为:

  1. 死锁
  2. 多个线程执行包含在单个组中的命令
  3. 命令中缺少线程分配

不过,从积极的方面来说,当代码适应死锁时(例如,重试当前包含的违规操作),不使用sp_getapplock/sp_releaseapplock且不会表现出不良行为的方法 2 和 3 的执行速度至少是两倍,如果不是更快的话.

我希望有人会指出我没有正确构建出列语句,这样我仍然可以继续使用表提示。 如果那不起作用,那就这样吧,但我想看看它是否可以做到同样的事情。

可以使用以下代码设置测试。

myQueue表的创建和人口与命令类似于够我的工作量:

CREATE TABLE myQueue
(
    ID INT  IDENTITY (1,1) PRIMARY KEY CLUSTERED,
    Main    INT, …
Run Code Online (Sandbox Code Playgroud)

sql-server concurrency locking queue

6
推荐指数
1
解决办法
234
查看次数

如何限制 SQL Server 代理的同时作业数?

我正在寻找一种可以限制同时运行的作业数量的设置(除了计划转移)。我的 SQL 代理(SQL Server 2017 Enterprise)中有 844 个作业。他们中的大多数需要几分钟才能完成,大约有 190 个工作需要半小时。所有这些都计划每小时运行一次。如果它们一起运行,我无法将总持续时间控制在 60 分钟以下。是否有任何设置可以将 744 个作业排队,直到 844 个作业中的一个完成并且 SQL 代理将启动在队列中等待的下一个作业?

sql-server queue

4
推荐指数
1
解决办法
644
查看次数

为什么我们的查询突然返回不该返回的行(使用 READPAST 和 UPDLOCK 选项)?

我们有一个看起来像这样的工作表

CREATE TABLE [dbo].[Clearing](
    [Skey] [decimal](19, 0) IDENTITY(1,1) NOT NULL,
    [BsAcctId] [int] NULL,
    [Status] [varchar](20) NULL,
     CONSTRAINT [csPk_Clearing] PRIMARY KEY CLUSTERED ( [Skey] ASC ) 
) 
Run Code Online (Sandbox Code Playgroud)

像这样的覆盖索引

CREATE NONCLUSTERED INDEX [IX_Status] ON [dbo].[Clearing]
(
    [Status] ASC
)
INCLUDE ( [Skey], [BsAcctId])
Run Code Online (Sandbox Code Playgroud)

我们使用这个查询来选择下一个工作

select top (1) Skey, BsAcctId, Status from Clearing with ( readpast, updlock )
  where (Clearing.Status = 'NEW')
  order by Clearing.Skey
Run Code Online (Sandbox Code Playgroud)

(真实表大约有 10 列。它们都在索引 include() 子句和选择列列表中。)

执行计划非常简单。它使用 IX_Status 进行索引查找,然后使用顶级运算符。由于索引按 (status, skey) 排序,因此计划不需要排序。

该表位于 AlwaysOn 可用性组中的数据库中。该组有 2 个数据库服务器。(这是一个测试系统。)

通常这个表和查询工作得很好。所以我们去应用 Windows …

sql-server concurrency queue availability-groups

4
推荐指数
2
解决办法
384
查看次数

一次(保证)更改后索引对“状态”字段的影响

介绍

我有一个 PostgreSQL 表设置作为队列/事件源。

我非常希望保留事件的“顺序”(即使在处理队列项之后)作为 e2e 测试的来源。

我开始遇到查询性能下降的问题(可能是因为表膨胀),并且我不知道如何有效地查询不断变化的键上的表。

初始设置

Postgres:v15

表DDL

CREATE TABLE eventsource.events (
    id serial4 NOT NULL,
    message jsonb NOT NULL,
    status varchar(50) NOT NULL,
    createdOn timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT events_pkey PRIMARY KEY (id)
);
CREATE INDEX ON eventsource.events (createdOn)
Run Code Online (Sandbox Code Playgroud)

抓取查询(伪代码)

BEGIN;  -- Start transaction

SELECT message, status
FROM eventsource.events ee
WHERE status = 'PENDING'
ORDER BY ee.createdOn ASC
FOR UPDATE SKIP LOCKED
LIMIT 10;  -- Get the OLDEST 10 events that are pending
-- I …
Run Code Online (Sandbox Code Playgroud)

postgresql index queue event query-performance

3
推荐指数
1
解决办法
502
查看次数

检索下一个队列项

我在 SQL Server 2012 中有一个简单的表,它实现了一个处理队列。随着数据的插入,检索下一个项目的查询从 <100 毫秒变为恒定的 5-6 秒。如果有人能指出性能突然下降的原因,我将不胜感激。(这似乎几乎是一夜之间的下跌)。

这是表定义:

CREATE TABLE [dbo].[messagequeue] (
    [id]             INT             IDENTITY (1, 1) NOT NULL,
    [testrunident]   VARCHAR (255)   NOT NULL,
    [filesequence]   INT             NOT NULL,
    [processed]      BIT             NOT NULL,
    [dateentered]    DATETIME        NULL,
    [filedata]       VARBINARY (MAX) NULL,
    [retries]        INT             NOT NULL,
    [failed]         BIT             NOT NULL,
    [msgobject]      VARBINARY (MAX) NULL,
    [errortext]      VARCHAR (MAX)   NULL,
    [sourcefilename] VARCHAR (MAX)   NULL,
    [xmlsource]      VARCHAR (MAX)   NULL,
    [messagetype]    VARCHAR (255)   NULL
);

CREATE NONCLUSTERED INDEX [messagequeue_sequenc_failed_idx]
    ON [dbo].[messagequeue]([processed] ASC, [failed] ASC)
    INCLUDE([id], …
Run Code Online (Sandbox Code Playgroud)

performance sql-server sql-server-2012 queue query-performance

2
推荐指数
1
解决办法
1071
查看次数