Skip to content

Commit 6a8e084

Browse files
authored
feat(Worker): Allows subset of workers to reduce processing (LLC-9)
#1418 https://learningpool.atlassian.net/browse/LLC-9
1 parent 8d0e78b commit 6a8e084

File tree

4 files changed

+86
-13
lines changed

4 files changed

+86
-13
lines changed

Diff for: .env.example

+11
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,17 @@ QUEUE_NAMESPACE=DEV
181181
#PUBSUB_GOOGLE_CLOUD_PROJECT_ID=
182182
#PUBSUB_GOOGLE_CLOUD_SUBSCRIPTION_NAME=ll
183183

184+
# Allowed worker queue list
185+
# Available queue names
186+
# STATEMENT_QUERYBUILDERCACHE_QUEUE
187+
# STATEMENT_PERSON_QUEUE
188+
# STATEMENT_FORWARDING_QUEUE
189+
# Separate them with comma.
190+
#
191+
# Not defining this variable would run all queues
192+
# Having it empty string would run no queues
193+
# ALLOWED_WORKER_QUEUES=STATEMENT_FORWARDING_QUEUE,STATEMENT_QUERYBUILDERCACHE_QUEUE
194+
184195
# Azure service bus endpoint, required if QUEUE_PROVIDER=SERVICE_BUS
185196
# SERVICE_BUS_ENDPOINT='Endpoint=sb://[namespace].servicebus.windows.net/;SharedAccessKeyName=[keyName];SharedAccessKey=[key]'
186197

Diff for: worker/src/handlers/statement/allowedWorkerQueues.js

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import logger from 'lib/logger';
2+
import {
3+
STATEMENT_QUERYBUILDERCACHE_QUEUE,
4+
STATEMENT_EXTRACT_PERSONAS_QUEUE,
5+
STATEMENT_FORWARDING_QUEUE,
6+
} from 'lib/constants/statements';
7+
8+
/**
9+
* allowable Worker Queues
10+
*
11+
* @type {string[]}
12+
*/
13+
const allowableWorkerQueues = [
14+
STATEMENT_QUERYBUILDERCACHE_QUEUE,
15+
STATEMENT_EXTRACT_PERSONAS_QUEUE,
16+
STATEMENT_FORWARDING_QUEUE,
17+
];
18+
19+
/**
20+
* @param {string | undefined} allowedWorkerQueuesString
21+
* @return {string[]}
22+
* @throws {Error}
23+
*/
24+
const getAllowedWorkerQueues = (allowedWorkerQueuesString) => {
25+
if (allowedWorkerQueuesString === undefined) {
26+
return allowableWorkerQueues;
27+
}
28+
29+
if (allowedWorkerQueuesString === '') {
30+
return [];
31+
}
32+
33+
return allowedWorkerQueuesString.split(',').reduce(
34+
(acc, queueString) => {
35+
if (allowableWorkerQueues.includes(queueString)) {
36+
return acc.concat([queueString]);
37+
}
38+
logger.warn(`"${queueString}" is ignored as an allowed worker queue. Allowable worker queues are ${allowableWorkerQueues.map(q => `"${q}"`).join(', ')}`);
39+
return acc;
40+
},
41+
[],
42+
);
43+
};
44+
45+
/**
46+
* @type {string[]}
47+
*/
48+
const allowedWorkerQueues = getAllowedWorkerQueues(process.env.ALLOWED_WORKER_QUEUES);
49+
50+
/* eslint-disable import/prefer-default-export*/
51+
export const isAllowedWorkerQueue = queueName => allowedWorkerQueues.includes(queueName);

Diff for: worker/src/handlers/statement/index.js

+20-12
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import {
2222
STATEMENT_FORWARDING_DEADLETTER_QUEUE
2323
} from 'lib/constants/statements';
2424

25+
import { isAllowedWorkerQueue } from './allowedWorkerQueues';
26+
2527
const defaultHandleResponse = queueName => (err) => {
2628
if (err) logger.error(`ERROR SUBSCRIBING TO QUEUE ${queueName}`, err);
2729
return err;
@@ -46,20 +48,26 @@ export default (
4648
onProcessed: statementHandlerProcessed
4749
}, handleResponse(STATEMENT_QUEUE));
4850

49-
Queue.subscribe({
50-
queueName: STATEMENT_EXTRACT_PERSONAS_QUEUE,
51-
handler: extractPersonasHandler(personaService)
52-
}, handleResponse(STATEMENT_EXTRACT_PERSONAS_QUEUE));
51+
if (isAllowedWorkerQueue(STATEMENT_EXTRACT_PERSONAS_QUEUE)) {
52+
Queue.subscribe({
53+
queueName: STATEMENT_EXTRACT_PERSONAS_QUEUE,
54+
handler: extractPersonasHandler(personaService)
55+
}, handleResponse(STATEMENT_EXTRACT_PERSONAS_QUEUE));
56+
}
5357

54-
Queue.subscribe({
55-
queueName: STATEMENT_QUERYBUILDERCACHE_QUEUE,
56-
handler: queryBuilderCacheHandler
57-
}, handleResponse(STATEMENT_QUERYBUILDERCACHE_QUEUE));
58+
if (isAllowedWorkerQueue(STATEMENT_QUERYBUILDERCACHE_QUEUE)) {
59+
Queue.subscribe({
60+
queueName: STATEMENT_QUERYBUILDERCACHE_QUEUE,
61+
handler: queryBuilderCacheHandler
62+
}, handleResponse(STATEMENT_QUERYBUILDERCACHE_QUEUE));
63+
}
5864

59-
Queue.subscribe({
60-
queueName: STATEMENT_FORWARDING_QUEUE,
61-
handler: statementForwardingHandler
62-
}, handleResponse(STATEMENT_FORWARDING_QUEUE));
65+
if (isAllowedWorkerQueue(STATEMENT_FORWARDING_QUEUE)) {
66+
Queue.subscribe({
67+
queueName: STATEMENT_FORWARDING_QUEUE,
68+
handler: statementForwardingHandler
69+
}, handleResponse(STATEMENT_FORWARDING_QUEUE));
70+
}
6371

6472
Queue.subscribe({
6573
queueName: STATEMENT_FORWARDING_REQUEST_QUEUE,

Diff for: worker/src/handlers/statement/statementHandler.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
STATEMENT_EXTRACT_PERSONAS_QUEUE,
1818
STATEMENT_FORWARDING_QUEUE
1919
} from 'lib/constants/statements';
20+
import { isAllowedWorkerQueue } from './allowedWorkerQueues';
2021

2122
const queueDependencies = {
2223
[STATEMENT_QUERYBUILDERCACHE_QUEUE]: {
@@ -49,8 +50,10 @@ export const addStatementToPendingQueues = (statement, passedQueues, done) => {
4950
const queueCompleted = includes(completedQueues, queueName);
5051
// or is this queue in the queues being processed?
5152
const queueProcessing = includes(processingQueues, queueName);
53+
// or is an allowed queue?
54+
const isAllowed = isAllowedWorkerQueue(queueName);
5255

53-
return !preReqsCompleted || queueCompleted || queueProcessing;
56+
return !preReqsCompleted || queueCompleted || queueProcessing || !isAllowed;
5457
});
5558

5659
return Statement.updateOne(

0 commit comments

Comments
 (0)