Skip to content

Commit

Permalink
Use "grpc" (C-based implementation) instead of "@grpc/grpc-js" (pure …
Browse files Browse the repository at this point in the history
…JavaScript implementation) due to issue/error under high load (See: grpc/grpc-node#1158)
  • Loading branch information
re7eal committed Mar 31, 2022
1 parent c25672c commit ca32017
Show file tree
Hide file tree
Showing 8 changed files with 2,064 additions and 208 deletions.
1,033 changes: 974 additions & 59 deletions main-server/package-lock.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion main-server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
},
"dependencies": {
"@babel/runtime": "^7.17.7",
"@grpc/grpc-js": "^1.5.10",
"@grpc/proto-loader": "^0.6.9",
"ajv": "^8.10.0",
"ajv-formats": "^2.1.1",
Expand All @@ -28,6 +27,7 @@
"data-urls": "^3.0.1",
"dotenv": "^16.0.0",
"express": "^4.17.3",
"grpc": "^1.24.11",
"ioredis": "^4.28.5",
"mkdirp": "^1.0.4",
"morgan": "^1.10.0",
Expand Down
12 changes: 3 additions & 9 deletions main-server/src/master-worker-interface/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import path from 'path';
import EventEmitter from 'events';

import * as grpc from '@grpc/grpc-js';
import * as grpc from 'grpc';
import * as protoLoader from '@grpc/proto-loader';

import { ExponentialBackoff } from 'simple-backoff';
Expand Down Expand Up @@ -169,15 +169,9 @@ export async function initialize() {
'grpc.keepalive_time_ms': config.grpcPingInterval,
'grpc.keepalive_timeout_ms': config.grpcPingTimeout,
'grpc.keepalive_permit_without_calls': 1,

// options for C-based version (not supported on pure JavaScript version)
// 'grpc.http2.max_pings_without_data': 0,
// 'grpc.http2.min_time_between_pings_ms': config.grpcPingInterval,

'grpc.http2.max_pings_without_data': 0,
'grpc.http2.min_time_between_pings_ms': config.grpcPingInterval,
'grpc.max_receive_message_length': -1,

// option for pure JavaScript version
'grpc-node.max_session_memory': 100,
}
);
await waitForReady(client);
Expand Down
48 changes: 17 additions & 31 deletions main-server/src/master-worker-interface/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import path from 'path';
import EventEmitter from 'events';

import * as grpc from '@grpc/grpc-js';
import * as grpc from 'grpc';
import * as protoLoader from '@grpc/proto-loader';

import { getArgsProtobuf } from './message';
Expand Down Expand Up @@ -79,17 +79,11 @@ export async function initialize() {
'grpc.keepalive_time_ms': config.grpcPingInterval,
'grpc.keepalive_timeout_ms': config.grpcPingTimeout,
'grpc.keepalive_permit_without_calls': 1,

// options for C-based version (not supported on pure JavaScript version)
// 'grpc.http2.max_pings_without_data': 0,
// 'grpc.http2.min_ping_interval_without_data_ms':
// config.grpcExpectedClientPingInterval,
// 'grpc.http2.min_time_between_pings_ms': config.grpcPingInterval,

'grpc.http2.max_pings_without_data': 0,
'grpc.http2.min_ping_interval_without_data_ms':
config.grpcExpectedClientPingInterval,
'grpc.http2.min_time_between_pings_ms': config.grpcPingInterval,
'grpc.max_receive_message_length': -1,

// option for pure JavaScript version
'grpc-node.max_session_memory': 100,
});
const MASTER_SERVER_ADDRESS = `0.0.0.0:${config.masterServerPort}`;

Expand All @@ -103,26 +97,18 @@ export async function initialize() {
workerStoppingCall,
});

const port = await new Promise((resolve, reject) => {
server.bindAsync(
MASTER_SERVER_ADDRESS,
config.grpcSsl
? grpc.ServerCredentials.createSsl(grpcSslRootCert, [
{
cert_chain: grpcSslCert,
private_key: grpcSslKey,
},
])
: grpc.ServerCredentials.createInsecure(),
(err, port) => {
if (err) {
reject(err);
return;
}
resolve(port);
}
);
});
const port = server.bind(
MASTER_SERVER_ADDRESS,
config.grpcSsl
? grpc.ServerCredentials.createSsl(grpcSslRootCert, [
{
cert_chain: grpcSslCert,
private_key: grpcSslKey,
},
])
: grpc.ServerCredentials.createInsecure()
);

server.start();

logger.info({
Expand Down
11 changes: 3 additions & 8 deletions main-server/src/mq/grpc_client.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import path from 'path';
import { EventEmitter } from 'events';

import * as grpc from '@grpc/grpc-js';
import * as grpc from 'grpc';
import * as protoLoader from '@grpc/proto-loader';
import { ExponentialBackoff } from 'simple-backoff';

Expand Down Expand Up @@ -160,13 +160,8 @@ export async function initialize({
'grpc.keepalive_time_ms': config.grpcPingInterval,
'grpc.keepalive_timeout_ms': config.grpcPingTimeout,
'grpc.keepalive_permit_without_calls': 1,

// options for C-based version (not supported on pure JavaScript version)
// 'grpc.http2.max_pings_without_data': 0,
// 'grpc.http2.min_time_between_pings_ms': config.grpcPingInterval,

// option for pure JavaScript version
'grpc-node.max_session_memory': 100,
'grpc.http2.max_pings_without_data': 0,
'grpc.http2.min_time_between_pings_ms': config.grpcPingInterval,
}
);
await waitForReady(client);
Expand Down
Loading

0 comments on commit ca32017

Please sign in to comment.