There is an option on Linux called SO_REUSEPORT, which allows two processes
to bind to the same port as long as they set the same options. The gRPC
libraries set this option to allow users to get a very basic kind of
multiprocessing/load balancing by simply spawning multiple copies of the
server process and allowing the kernel to decide which process each
connection goes to.

On Mon, Mar 11, 2019 at 1:17 PM Rob Cecil <[email protected]> wrote:

> That was it. Fork!!
>
> The process was spawned on 3/5.
>
> Thanks!
>
> How can two servers bind to the same ip&port ?
>
> On Monday, March 11, 2019 at 3:47:18 PM UTC-4, Michael Lumish wrote:
>>
>> Can you make sure you don't have any other servers running on that same
>> machine? One possibility here is that another gRPC service without that
>> method implemented is bound to this port and either the bind call is
>> failing (the example code does not check the return value), or they are
>> both binding the port and the incoming connection is going to the wrong one.
>>
>> On Mon, Mar 11, 2019 at 12:01 PM Rob Cecil <[email protected]> wrote:
>>
>>> https://gist.github.com/robcecil/1f030e2c8bfa45b567128e50e2156dad
>>>
>>> Running Node v11.10.0 on Ubuntu Comic 18.10.
>>>
>>>
>>> On Monday, March 11, 2019 at 2:30:13 PM UTC-4, Rob Cecil wrote:
>>>>
>>>> I updated everything:
>>>>
>>>> wander@peniche:~/control-web$ npm list --depth=0 2>/dev/null
>>>> [email protected] /home/wander/control-web
>>>> ├── @grpc/[email protected]
>>>> ├── [email protected]
>>>> ├── [email protected]
>>>> ├── [email protected]
>>>> ├── [email protected]
>>>> ├── [email protected]
>>>> ├── [email protected]
>>>> ├── [email protected]
>>>> └── [email protected]
>>>>
>>>> I still see the same behavior.
>>>>
>>>> If I change my server.,js:
>>>>
>>>> function main() {
>>>>     var server = new grpc.Server();
>>>>     server.addService(test.Greeter.service, {
>>>>         sayHello: SayHello,
>>>>         sayHelp: SayHelp
>>>>     });
>>>>     //console.dir(util.inspect(server,  showHidden=false, depth=5,
>>>> colorize=false));
>>>>     server.bind(argv.h, grpc.ServerCredentials.createInsecure());
>>>>     server.start();
>>>> }
>>>>
>>>> Restart, ... I see the same behavior.
>>>>
>>>>
>>>> On Monday, March 11, 2019 at 12:41:14 PM UTC-4, Michael Lumish wrote:
>>>>>
>>>>> Can you try updating your dependencies? I just tried running the given
>>>>> code with the latest versions of grpc and @grpc/proto-loader and it 
>>>>> worked.
>>>>> There was previously an issue that the library would not accept method
>>>>> names with the same casing as in the original proto file, but that was
>>>>> fixed a while ago.
>>>>>
>>>>> As a side note, the `keepCase` option in `proto-loader` affects
>>>>> message field names. If it is not set, the field names are transformed to
>>>>> camel case.
>>>>>
>>>>> On Mon, Mar 11, 2019 at 8:14 AM 'Mya Pitzeruse' via grpc.io <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> On the server side, try using lowercase names instead of title case:
>>>>>>
>>>>>>     server.addService(test.Greeter.service, {
>>>>>>         sayHello: SayHello,
>>>>>>         sayHelp: SayHelp
>>>>>>     });
>>>>>>
>>>>>> I would assume that using "keepCase: true" meant that they would
>>>>>> require these to be the same as the proto. But here's an example where I
>>>>>> use the same loader semantic and the same casing:
>>>>>>
>>>>>> https://github.com/mjpitz/des/blob/master/api/extractor.proto#L19
>>>>>> https://github.com/mjpitz/des/blob/master/api/extractor.js#L8
>>>>>>
>>>>>> And all of my service methods are use camel case instead of the case
>>>>>> I used in the proto file:
>>>>>>
>>>>>> https://github.com/mjpitz/des/blob/master/src/service/unasyncify.ts#L9
>>>>>>
>>>>>>
>>>>>> On Sat, Mar 9, 2019 at 10:08 AM Rob Cecil <[email protected]> wrote:
>>>>>>
>>>>>>> I'm experienced with Grpc - having built iOS/ObjC front-end and C#
>>>>>>> backend over a two year period (a Grpc project consisting of a main 
>>>>>>> proto
>>>>>>> with a service that has 27 methods, and about a dozen supporting protos 
>>>>>>> for
>>>>>>> message definitions).
>>>>>>>
>>>>>>> I am however, not super experienced with web development, so I am a
>>>>>>> little frustrated atm, trying to get simple things to work with 
>>>>>>> Grpc-node.
>>>>>>> I started with something simple - the HelloWorld example and modified it
>>>>>>> from there.
>>>>>>>
>>>>>>> Here is my current "test.proto":
>>>>>>>
>>>>>>> syntax = "proto3";
>>>>>>>
>>>>>>>
>>>>>>> package helloworld;
>>>>>>>
>>>>>>>
>>>>>>> service Greeter {
>>>>>>>     rpc SayHello(FooBarRequest) returns (FooBarReply);
>>>>>>>     rpc SayHelp(FooBarRequest) returns (FooBarReply);
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> message FooBarRequest {
>>>>>>>     string name = 1;
>>>>>>> }
>>>>>>>
>>>>>>> message FooBarReply {
>>>>>>>     string message = 1;
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> server.js:
>>>>>>>
>>>>>>> const _ = require('lodash');
>>>>>>> const grpc = require('grpc');
>>>>>>> const protoLoader = require('@grpc/proto-loader');
>>>>>>>
>>>>>>>
>>>>>>> const argv = require("minimist")(process.argv.slice(2));
>>>>>>> console.dir(argv);
>>>>>>>
>>>>>>>
>>>>>>> if (!argv.h) {
>>>>>>>     console.log("Please start server.js with -h xx.xx.xx.xx:xxxx");
>>>>>>>     process.exit(1);
>>>>>>> }
>>>>>>> console.log(`Starting server.js on : ${argv.h}`);
>>>>>>>
>>>>>>>
>>>>>>> const PROTOS_PATH = __dirname + '/../protos/';
>>>>>>> const BESERVICE_PROTO_PATH = PROTOS_PATH + 'test.proto';
>>>>>>>
>>>>>>>
>>>>>>> const beDefinition = protoLoader.loadSync(
>>>>>>>     BESERVICE_PROTO_PATH,
>>>>>>>     {keepCase: true,
>>>>>>>      longs: String,
>>>>>>>      enums: String,
>>>>>>>      defaults: true,
>>>>>>>      oneofs: true
>>>>>>>     });
>>>>>>>
>>>>>>>
>>>>>>> const test = grpc.loadPackageDefinition(beDefinition).helloworld;
>>>>>>>
>>>>>>>
>>>>>>> function SayHello(call, callback) {
>>>>>>>     callback(null, {message: 'Hello ' + call.request.name});
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> function SayHelp(call, callback) {
>>>>>>>     callback(null, {message: 'Help! ' + call.request.name});
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> function main() {
>>>>>>>     var server = new grpc.Server();
>>>>>>>     server.addService(test.Greeter.service, {
>>>>>>>         SayHello: SayHello,
>>>>>>>         SayHelp: SayHelp
>>>>>>>     });
>>>>>>>     server.bind(argv.h, grpc.ServerCredentials.createInsecure());
>>>>>>>     server.start();
>>>>>>> }
>>>>>>>
>>>>>>> main();
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> client.js:
>>>>>>>
>>>>>>> const grpc = require('grpc');
>>>>>>> const util = require('util')
>>>>>>> const protoLoader = require('@grpc/proto-loader');
>>>>>>> const argv = require("minimist")(process.argv.slice(2));
>>>>>>> console.dir(argv);
>>>>>>>
>>>>>>>
>>>>>>> if (!argv.h) {
>>>>>>>     console.log("Please start with -h xx.xx.xx.xx:xxxx");
>>>>>>>     process.exit(1);
>>>>>>> }
>>>>>>> console.log(`Starting Node backend client on : ${argv.h}`);
>>>>>>>
>>>>>>>
>>>>>>> const PROTOS_PATH = __dirname + '/../protos/';
>>>>>>> const BESERVICE_PROTO_PATH = PROTOS_PATH + 'test.proto';
>>>>>>>
>>>>>>>
>>>>>>> const beDefinition = protoLoader.loadSync(
>>>>>>>     BESERVICE_PROTO_PATH,
>>>>>>>     {keepCase: true,
>>>>>>>      longs: String,
>>>>>>>      enums: String,
>>>>>>>      defaults: true,
>>>>>>>      oneofs: true
>>>>>>>     });
>>>>>>>
>>>>>>>
>>>>>>> const test = grpc.loadPackageDefinition(beDefinition).helloworld;
>>>>>>>
>>>>>>>
>>>>>>> function main() {
>>>>>>>     var client = new test.Greeter(argv.h, grpc.credentials.
>>>>>>> createInsecure());
>>>>>>>
>>>>>>>     client.SayHello({ name: 'Darth' }, {}, (err, response) => {
>>>>>>>         if (err) {
>>>>>>>             console.error("error calling SayHello", err);
>>>>>>>             return
>>>>>>>         }
>>>>>>>         console.log('Greeting:', response.message);
>>>>>>>
>>>>>>>
>>>>>>>         client.SayHelp({ name: 'Darth' }, {}, (err, response) => {
>>>>>>>             if (err) {
>>>>>>>                 console.error("error calling SayHelp", err);
>>>>>>>                 return
>>>>>>>             }
>>>>>>>             console.log('Help! ', response.message);
>>>>>>>         });
>>>>>>>     });
>>>>>>>   }
>>>>>>>
>>>>>>>   main();
>>>>>>>
>>>>>>>
>>>>>>> I run the client and server on the same machine, using the same
>>>>>>> command line argument for the same host & port.
>>>>>>>
>>>>>>> Can anyone explain why I get "RPC method not implemented" on the
>>>>>>> second method defined in the  Greeter service above?
>>>>>>>
>>>>>>> wander@peniche:~/control-web/js$ !1186
>>>>>>> node server.js -h 172.16.0.168:9090 &
>>>>>>> [1] 57465
>>>>>>> wander@peniche:~/control-web/js$ { _: [], h: '172.16.0.168:9090' }
>>>>>>> Starting server.js on : 172.16.0.168:9090
>>>>>>>
>>>>>>>
>>>>>>> wander@peniche:~/control-web/js$ !1187
>>>>>>> node backendservice-node-client.js -h 172.16.0.168:9090
>>>>>>> { _: [], h: '172.16.0.168:9090' }
>>>>>>> Starting Node backend client on : 172.16.0.168:9090
>>>>>>> Greeting: Hello! Darth
>>>>>>> error calling SayHelp { Error: 12 UNIMPLEMENTED: RPC method not
>>>>>>> implemented /helloworld.Greeter/SayHelp
>>>>>>>     at Object.exports.createStatusError (/home/wander/control-web/
>>>>>>> node_modules/grpc/src/common.js:91:15)
>>>>>>>     at Object.onReceiveStatus (/home/wander/control-web/node_modules
>>>>>>> /grpc/src/client_interceptors.js:1204:28)
>>>>>>>     at InterceptingListener._callNext (/home/wander/control-web/
>>>>>>> node_modules/grpc/src/client_interceptors.js:568:42)
>>>>>>>     at InterceptingListener.onReceiveStatus (/home/wander/control-
>>>>>>> web/node_modules/grpc/src/client_interceptors.js:618:8)
>>>>>>>     at callback (/home/wander/control-web/node_modules/grpc/src/
>>>>>>> client_interceptors.js:845:24)
>>>>>>>   code: 12,
>>>>>>>   metadata: Metadata { _internal_repr: {} },
>>>>>>>   details: 'RPC method not implemented /helloworld.Greeter/SayHelp'
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> If i remove the SayHelp method in the proto and update the client &
>>>>>>> server code, it works fine.
>>>>>>>
>>>>>>> THANKS
>>>>>>>
>>>>>>> --
>>>>>>> You received this message because you are subscribed to the Google
>>>>>>> Groups "grpc.io" group.
>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>> send an email to [email protected].
>>>>>>> To post to this group, send email to [email protected].
>>>>>>> Visit this group at https://groups.google.com/group/grpc-io.
>>>>>>> To view this discussion on the web visit
>>>>>>> https://groups.google.com/d/msgid/grpc-io/3c7c48bc-3612-4c7e-9b30-9a30e47d1286%40googlegroups.com
>>>>>>> <https://groups.google.com/d/msgid/grpc-io/3c7c48bc-3612-4c7e-9b30-9a30e47d1286%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>>
>>>>>> Mya Pitzeruse
>>>>>>
>>>>>> Senior Software Engineer - Service Infrastructure
>>>>>>
>>>>>> Gender Pronouns: She, Her, Hers
>>>>>>
>>>>>> [email protected]
>>>>>>
>>>>>>
>>>>>> Indeed - We help people get jobs.
>>>>>>
>>>>>> Indeed.com <http://www.indeed.com/>
>>>>>>
>>>>>> Facebook <http://www.facebook.com/indeed>  |
>>>>>> <http://www.twitter.com/indeed>
>>>>>>
>>>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "grpc.io" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> To post to this group, send email to [email protected].
>>> Visit this group at https://groups.google.com/group/grpc-io.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/grpc-io/9bcbda49-2257-4543-abc9-bc5b2600581d%40googlegroups.com
>>> <https://groups.google.com/d/msgid/grpc-io/9bcbda49-2257-4543-abc9-bc5b2600581d%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>> --
> You received this message because you are subscribed to the Google Groups "
> grpc.io" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/grpc-io.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/grpc-io/4fb6e6e8-79eb-4a44-a289-a0ba73c53fb3%40googlegroups.com
> <https://groups.google.com/d/msgid/grpc-io/4fb6e6e8-79eb-4a44-a289-a0ba73c53fb3%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/grpc-io.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/CAPK2-4cqrw7Coa4j0y%3DLLqkTVt2CjvH%2BW4aP2PDvDWGDOSOtzA%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to