处理特定的作业类别
绝大多数极狐GitLab 应该有更多进程来监听所有队列。
另外一种方法是使用路由规则,它可以应用程序内部的指定作业类定向到您配置的队列中。然后,Sidekiq 进程仅需要监听并处理配置的队列即可。这样做可以降低 Redis 的负载,对于非常大规模的部署很重要。
路由规则
- 默认路由规则值添加于 15.4 版本。
- 极狐GitLab 17.0 中,路由规则替换了队列选择器。
mailers
队列。使用路由规则时,确保至少有一个进程正在侦听 mailers
队列。通常可以放在 default
队列旁边。我们建议大多数极狐GitLab 实例,使用路由规则来管理它们的 Sidekiq 队列,其允许管理员根据作业类的属性为作业类组选择单个队列名称。语法是成对的 [query, queue]
有序数组:
- 该查询是一个 worker 匹配查询。
- 队列名称必须是有效的 Sidekiq 队列名称。如果队列名称为
nil
或空字符串,则 worker 将路由到由 worker 名称生成的队列(有关详细信息,请参阅可用作业类列表)。队列名称不必与可用作业类列表中的任何现有队列名称相匹配。 - 为该 worker 选择与其匹配的第一个查询,以后的规则将被忽略。
路由规则迁移
Sidekiq 路由规则更改后,管理员必须注意迁移以避免完全丢失作业,尤其是在作业队列很长的系统中。迁移可以按照 Sidekiq 作业迁移中提到的迁移步骤完成。
详细示例
以下为旨在展示不同可能性的综合示例,不是建议。
-
编辑
/etc/gitlab/gitlab.rb
:sidekiq['routing_rules'] = [ # Route all non-CPU-bound workers that are high urgency to `high-urgency` queue ['resource_boundary!=cpu&urgency=high', 'high-urgency'], # Route all database, gitaly and global search workers that are throttled to `throttled` queue ['feature_category=database,gitaly,global_search&urgency=throttled', 'throttled'], # Route all workers having contact with outside world to a `network-intenstive` queue ['has_external_dependencies=true|feature_category=hooks|tags=network', 'network-intensive'], # Route all import workers to the queues generated by the worker name, for # example, JiraImportWorker to `jira_import`, SVNWorker to `svn_worker` ['feature_category=import', 'import'], # Wildcard matching, route the rest to `default` queue ['*', 'default'] ]
然后可以设置
queue_groups
以匹配这些生成的队列名称。例如:sidekiq['queue_selector'] = false sidekiq['queue_groups'] = [ # Run two high-urgency processes 'high-urgency', 'high-urgency', # Run one process for throttled, network-intensive, import 'throttled,network-intensive,import', # Run one 'catchall' process on the default and mailers queues 'default,mailers' ]
-
保存文件并重新配置极狐GitLab:
sudo gitlab-ctl reconfigure
Worker 匹配查询
极狐GitLab 提供了一种查询语法来根据其属性匹配 worker。队列路由规则和队列选择器都使用此查询语法。查询包括两个部分:
- 可以选择的属性。
- 用于构造查询的运算符。
可用属性
队列匹配查询适用于 worker 属性。我们支持基于 worker 属性子集的查询:
-
feature_category
- 队列所属的极狐GitLab 功能类别。例如,merge
队列属于source_code_management
类别。 -
has_external_dependencies
- 队列是否连接到外部服务。例如,所有导入器都将此设置为true
。 -
urgency
- 该队列的作业快速运行是多么重要。可以是high
、low
或throttled
。例如,authorized_projects
队列用于刷新用户权限,是high
紧急的。 -
worker_name
- worker 名称。使用此属性来选择特定的 worker。 -
name
- 从 worker 名称生成的队列名称。使用此属性选择特定队列。因为这是从 worker 名称生成的,所以不会根据其他路由规则的结果而改变。 -
resource_boundary
- 队列被cpu
、memory
或unknown
绑定。例如,ProjectExportWorker
是内存绑定的,因为它必须在保存数据以供导出之前将数据加载到内存中。 -
tags
- 队列的短期注释。这些预计会在不同版本之间频繁更改,并且可能会被完全删除。
has_external_dependencies
是一个 boolean 属性:只有确切的字符串 true
被认定为 true,其他的都被认定为 false。
tags
是一个集合,这意味着 =
检查相交集,而 !=
检查不相交集。例如,tags=a,b
选择具有标签 a
、b
或两者兼有的队列。tags!=a,b
选择没有这些标签的队列。
可用的运算符
路由规则和队列选择器支持以下运算符,从最高到最低优先级列出:
-
|
- 逻辑OR
运算符。例如,query_a|query_b
(其中query_a
和query_b
是由此处的其他运算符组成的查询)包括匹配任一查询的队列。 -
&
- 逻辑AND
运算符。例如,query_a&query_b
(其中query_a
和query_b
是由此处的其他运算符组成的查询)将仅包括与这两个查询匹配的队列。 -
!=
-NOT IN
运算符。例如,feature_category!=issue_tracking
从issue_tracking
特征类别中排除所有队列。 -
=
-IN
运算符。例如,resource_boundary=cpu
包括所有受 CPU 限制的队列。 -
,
- the concatenate set 运算符。例如,feature_category=continuous_integration,pages
包括来自continuous_integration
类别或pages
类别的所有队列。此示例也可以使用 OR 运算符,但允许更简洁,并且优先级更低。
此语法的运算符优先级是固定的:不可能使 AND
具有比 OR
更高的优先级。
与上面的标准队列组语法一样,单个 *
作为整个队列组选择所有队列。
可用的作业类列表
有关现有 Sidekiq 作业类和队列的列表,请检查以下文件: