GithubHelp home page GithubHelp logo

appscode / g2 Goto Github PK

View Code? Open in Web Editor NEW
170.0 170.0 24.0 7.48 MB

๐Ÿ‘พ Gearman in Golang

License: Apache License 2.0

Go 75.68% Python 15.37% Shell 6.55% Makefile 2.14% Smarty 0.26%
gearman kubernetes

g2's People

Contributors

ashiquzzaman33 avatar azylman avatar dgryski avatar diptadas avatar draxil avatar gbarr avatar jbaikge avatar jessonchan avatar kirkwood avatar kujohn avatar mikespook avatar miraclesu avatar paulmach avatar rlmcpherson avatar robvdl avatar runningwild avatar sadlil avatar sgrimee avatar tahsinrahman avatar tamalsaha avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

g2's Issues

worker starts only if all servers are available

I have a failover scenario with multiple gearmand servers but most time only one of them is running. With the gearman c library i just add all those servers to our worker and it runs jobs from those who are available.
The go worker croaks on worker.Ready() on the first server which is unavailable. Wouldn't it be better to only croak if all server are unavailable?

Compatibility with php gearmanclient

Hi

We're currently in the process of migrating our legacy application to a kubernetes cluster with your Gearman server. We running into a weird timeout issue when trying to insert jobs (or a simple ping command from php). It makes me wonder whether if there a reason why the Gearman PECL php package wouldn't work with the Go server?

If I connect to the Gearman server instance from the same pod as the php code is running in through telnet, everything works fine; when trying to run a simple php script against it, it just hangs.

Telnet command & response:

root@test-5cf49f485b-248k9:/var/www# telnet gearmand 4730
Trying 10.99.14.245...
Connected to gearmand.default.svc.cluster.local.
Escape character is '^]'.

php script:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 'on');

$client = new GearmanClient();
$client->addServers('gearmand:4730');

print_r($client->ping('test'));
print_r($client->error());

libgearman version: 1.0.6

When I execute the php script, it just hangs indefiniately. Any idea what this could be?

This is (part of) the output of a strace on the process:

 0.000384 connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.96.0.10")}, 16) = 0
     0.000157 poll([{fd=3, events=POLLOUT}], 1, 0) = 1 ([{fd=3, revents=POLLOUT}])
     0.000237 sendmmsg(3, [{msg_hdr={msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="\361\r\1\0\0\1\0\0\0\0\0\0\10gearmand\7default\3sv"..., iov_len=52}], msg_iovlen=1, msg_controllen=0, msg_flags=0}, msg_len=52}, {msg_hdr={msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="\r2\1\0\0\1\0\0\0\0\0\0\10gearmand\7default\3sv"..., iov_len=52}], msg_iovlen=1, msg_controllen=0, msg_flags=0}, msg_len=52}], 2, MSG_NOSIGNAL) = 2
     0.000586 poll([{fd=3, events=POLLIN}], 1, 5000) = 1 ([{fd=3, revents=POLLIN}])
     0.000106 ioctl(3, FIONREAD, [68])  = 0
     0.000120 recvfrom(3, "\361\r\205\200\0\1\0\1\0\0\0\0\10gearmand\7default\3sv"..., 2048, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.96.0.10")}, [28->16]) = 68
     0.000335 poll([{fd=3, events=POLLIN}], 1, 4998) = 1 ([{fd=3, revents=POLLIN}])
     0.000117 ioctl(3, FIONREAD, [106]) = 0
     0.000110 recvfrom(3, "\r2\205\200\0\1\0\0\0\1\0\0\10gearmand\7default\3sv"..., 65536, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("10.96.0.10")}, [28->16]) = 106
     0.000128 close(3)                  = 0
     0.000145 socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_TCP) = 3
     0.000115 setsockopt(3, SOL_TCP, TCP_NODELAY, [1], 4) = 0
     0.000107 setsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=1, linger=10}, 8) = 0
     0.000169 setsockopt(3, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
     0.000115 setsockopt(3, SOL_SOCKET, SO_SNDBUF, [32768], 4) = 0
     0.000176 setsockopt(3, SOL_SOCKET, SO_RCVBUF, [32768], 4) = 0
     0.000143 connect(3, {sa_family=AF_INET, sin_port=htons(4730), sin_addr=inet_addr("10.99.14.245")}, 16) = -1 EINPROGRESS (Operation now in progress)
     0.000504 poll([{fd=3, events=POLLOUT}], 1, -1) = 1 ([{fd=3, revents=POLLOUT}])
     0.000225 sendto(3, "\0REQ\0\0\0\32\0\0\0\nexceptions", 22, MSG_NOSIGNAL, NULL, 0) = 22
     0.000268 recvfrom(3, 0x55aae1dad9b1, 8192, MSG_NOSIGNAL, NULL, NULL) = -1 EAGAIN (Resource temporarily unavailable)
     0.000151 poll([{fd=3, events=POLLIN}], 1, -1

Log on the gearman g2 pod:

I1222 13:45:23.108439       1 session.go:46] new session with sessionId 32 and address: 172.17.0.21:34440
I1222 13:45:23.108499       1 session.go:82] incoming&lt;= sessionId: 32 protocol: PT_OptionReq len(args): 1 details: exceptions
I1222 13:45:23.108503       1 session.go:176] not support type PT_OptionReq

Odd use of time.Duration in the client API

It seems a very strange API to use time.Duration for Client.ResponseTimeout but specify that it's in milliseconds. One of the points of time.Duration is to abstract the time unit. It's very unintuitive to someone who has been using Go for years to use it in the way you've specified it.

I understand that it would be an API break to change it, but I wanted to note it because it led to a bug on my end that was very difficult to debug.

Crash: "fatal error: concurrent map iteration and map write"

This happened when submitting (or processing?) a large number of new jobs with a unique identifier on them.

 fatal error: concurrent map iteration and map write 
 goroutine 48 [running]: 
 runtime.throw(0x91b410, 0x26) 
 	/usr/local/go/src/runtime/panic.go:596 +0x95 fp=0xc420023de8 sp=0xc420023dc8 
 runtime.mapiternext(0xc420023f68) 
 	/usr/local/go/src/runtime/hashmap.go:737 +0x7ee fp=0xc420023e98 sp=0xc420023de8 
 github.com/appscode/g2/pkg/server.(*Server).WatchJobTimeout(0xc42014b220) 
 	/go/src/github.com/appscode/g2/pkg/server/server.go:841 +0x13e fp=0xc420023fd8 sp=0xc420023e98 
 runtime.goexit() 
 	/usr/local/go/src/runtime/asm_amd64.s:2197 +0x1 fp=0xc420023fe0 sp=0xc420023fd8 
 created by github.com/appscode/g2/pkg/server.(*Server).Start 
 	/go/src/github.com/appscode/g2/pkg/server/server.go:153 +0x215 
 goroutine 1 [IO wait]: 
 net.runtime_pollWait(0x7fbe42e35660, 0x72, 0x0) 
 	/usr/local/go/src/runtime/netpoll.go:164 +0x59 
 net.(*pollDesc).wait(0xc420048068, 0x72, 0x0, 0xc42000a360) 
 	/usr/local/go/src/net/fd_poll_runtime.go:75 +0x38 
 net.(*pollDesc).waitRead(0xc420048068, 0xffffffffffffffff, 0x0) 
 	/usr/local/go/src/net/fd_poll_runtime.go:80 +0x34 
 net.(*netFD).accept(0xc420048000, 0x0, 0xb30180, 0xc42000a360) 
 	/usr/local/go/src/net/fd_unix.go:430 +0x1e5 
 net.(*TCPListener).accept(0xc4200ae020, 0xc42005fbd0, 0x7fa4b0, 0x455ab0) 
 	/usr/local/go/src/net/tcpsock_posix.go:136 +0x2e 
 net.(*TCPListener).Accept(0xc4200ae020, 0x926b20, 0xc42000a280, 0xc42014b220, 0xb386c0) 
 	/usr/local/go/src/net/tcpsock.go:228 +0x49 
 github.com/appscode/g2/pkg/server.(*Server).Start(0xc42014b220) 
 	/go/src/github.com/appscode/g2/pkg/server/server.go:164 +0x24e 
 main.NewCmdRun.func1(0xc4201706c0, 0xb85770, 0x0, 0x0) 
 	/go/src/github.com/appscode/g2/cmd/gearmand/run.go:20 +0x8f 
 github.com/appscode/g2/vendor/github.com/spf13/cobra.(*Command).execute(0xc4201706c0, 0xb85770, 0x0, 0x0, 0xc4201706c0, 0xb85770) 
 	/go/src/github.com/appscode/g2/vendor/github.com/spf13/cobra/command.go:651 +0x23a 
 github.com/appscode/g2/vendor/github.com/spf13/cobra.(*Command).ExecuteC(0xc420170240, 0xc420137f70, 0xc42012d000, 0xc4201294a0) 
 	/go/src/github.com/appscode/g2/vendor/github.com/spf13/cobra/command.go:726 +0x339 
 github.com/appscode/g2/vendor/github.com/spf13/cobra.(*Command).Execute(0xc420170240, 0xc420137f68, 0x1) 
 	/go/src/github.com/appscode/g2/vendor/github.com/spf13/cobra/command.go:685 +0x2b 
 main.main() 
 	/go/src/github.com/appscode/g2/cmd/gearmand/main.go:32 +0x177 
 goroutine 5 [chan receive, 2 minutes]: 
 github.com/appscode/g2/vendor/github.com/golang/glog.(*loggingT).flushDaemon(0xb692c0) 
 	/go/src/github.com/appscode/g2/vendor/github.com/golang/glog/glog.go:879 +0x7a 
 created by github.com/appscode/g2/vendor/github.com/golang/glog.init.1 
 	/go/src/github.com/appscode/g2/vendor/github.com/golang/glog/glog.go:410 +0x21d 
 goroutine 35 [runnable]: 
 github.com/appscode/g2/pkg/server.genJid(0x8565c0, 0xc42013e4e0) 
 	/go/src/github.com/appscode/g2/pkg/server/util.go:78 +0x7d 
 github.com/appscode/g2/pkg/server.init.1.func1() 
 	/go/src/github.com/appscode/g2/pkg/server/util.go:71 +0x22 
 created by github.com/appscode/g2/pkg/server.init.1 
 	/go/src/github.com/appscode/g2/pkg/server/util.go:73 +0x1b5 
 goroutine 36 [select]: 
 github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb/util.(*BufferPool).drain(0xc4201560e0) 
 	/go/src/github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb/util/buffer_pool.go:206 +0x23f 
 created by github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb/util.NewBufferPool 
 	/go/src/github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb/util/buffer_pool.go:237 +0x19c 
 goroutine 41 [select, 2 minutes]: 
 github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb.(*DB).compactionError(0xc420192000) 
 	/go/src/github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go:90 +0x5d9 
 created by github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb.openDB 
 	/go/src/github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb/db.go:139 +0x583 
 goroutine 42 [select, 2 minutes]: 
 github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb.(*DB).mpoolDrain(0xc420192000) 
 	/go/src/github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb/db_state.go:101 +0x249 
 created by github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb.openDB 
 	/go/src/github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb/db.go:140 +0x5a5 
 goroutine 43 [select, 2 minutes]: 
 github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb.(*DB).tCompaction(0xc420192000) 
 	/go/src/github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go:804 +0x638 
 created by github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb.openDB 
 	/go/src/github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb/db.go:146 +0x722 
 goroutine 44 [select, 2 minutes]: 
 github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb.(*DB).mCompaction(0xc420192000) 
 	/go/src/github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go:751 +0x242 
 created by github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb.openDB 
 	/go/src/github.com/appscode/g2/vendor/github.com/syndtr/goleveldb/leveldb/db.go:147 +0x744 
 goroutine 45 [runnable]: 
 github.com/appscode/g2/pkg/server.(*Server).EvtLoop(0xc42014b220) 
 	/go/src/github.com/appscode/g2/pkg/server/server.go:796 +0x139 
 created by github.com/appscode/g2/pkg/server.(*Server).Start 
 	/go/src/github.com/appscode/g2/pkg/server/server.go:137 +0x1be 
 goroutine 46 [IO wait, 2 minutes]: 
 net.runtime_pollWait(0x7fbe42e355a0, 0x72, 0x0) 
 	/usr/local/go/src/runtime/netpoll.go:164 +0x59 
 net.(*pollDesc).wait(0xc42010c768, 0x72, 0x0, 0xc420190380) 
 	/usr/local/go/src/net/fd_poll_runtime.go:75 +0x38 
 net.(*pollDesc).waitRead(0xc42010c768, 0xffffffffffffffff, 0x0) 
 	/usr/local/go/src/net/fd_poll_runtime.go:80 +0x34 
 net.(*netFD).accept(0xc42010c700, 0x0, 0xb30180, 0xc420190380) 
 	/usr/local/go/src/net/fd_unix.go:430 +0x1e5 
 net.(*TCPListener).accept(0xc420138030, 0xc420128e40, 0xc42003ce08, 0x4e2bed) 
 	/usr/local/go/src/net/tcpsock_posix.go:136 +0x2e 
 net.(*TCPListener).AcceptTCP(0xc420138030, 0x6e9f83, 0xc42003ce20, 0xc42003ce18) 
 	/usr/local/go/src/net/tcpsock.go:215 +0x49 
 net/http.tcpKeepAliveListener.Accept(0xc420138030, 0xc420128e10, 0x879600, 0xb5a940, 0x8be000) 
 	/usr/local/go/src/net/http/server.go:3044 +0x2f 
 net/http.(*Server).Serve(0xc420146160, 0xb35b00, 0xc420138030, 0x0, 0x0) 
 	/usr/local/go/src/net/http/server.go:2643 +0x228 
 net/http.(*Server).ListenAndServe(0xc420146160, 0xc420146160, 0x2) 
 	/usr/local/go/src/net/http/server.go:2585 +0xb0 
 net/http.ListenAndServe(0x906c6d, 0x5, 0x0, 0x0, 0x0, 0x0) 
 	/usr/local/go/src/net/http/server.go:2787 +0x7f 
 github.com/appscode/g2/pkg/server.(*Server).Start.func1(0xc42014b220) 
 	/go/src/github.com/appscode/g2/pkg/server/server.go:148 +0x1ee 
 created by github.com/appscode/g2/pkg/server.(*Server).Start 
 	/go/src/github.com/appscode/g2/pkg/server/server.go:149 +0x33c 
 goroutine 47 [chan receive, 2 minutes]: 
 github.com/appscode/g2/pkg/server.(*Server).WatcherLoop(0xc42014b220) 
 	/go/src/github.com/appscode/g2/pkg/server/server.go:809 +0x7c 
 created by github.com/appscode/g2/pkg/server.(*Server).Start 
 	/go/src/github.com/appscode/g2/pkg/server/server.go:152 +0x1f0 
 goroutine 49 [select, 2 minutes]: 
 github.com/appscode/g2/vendor/gopkg.in/robfig/cron%2ev2.(*Cron).run(0xc42012e5a0) 
 	/go/src/github.com/appscode/g2/vendor/gopkg.in/robfig/cron.v2/cron.go:182 +0x96c 
 created by github.com/appscode/g2/vendor/gopkg.in/robfig/cron%2ev2.(*Cron).Start 
 	/go/src/github.com/appscode/g2/vendor/gopkg.in/robfig/cron.v2/cron.go:157 +0x43 
 goroutine 8 [runnable]: 
 github.com/appscode/g2/pkg/server.(*session).handleBinaryConnection(0xc42000a280, 0xc42014b220, 0xb386c0, 0xc42000c028, 0xc42014e1e0, 0x2, 0xc42014e120) 
 	/go/src/github.com/appscode/g2/pkg/server/session.go:131 +0xa77 
 github.com/appscode/g2/pkg/server.(*session).handleConnection(0xc42000a280, 0xc42014b220, 0xb386c0, 0xc42000c028) 
 	/go/src/github.com/appscode/g2/pkg/server/session.go:61 +0x3bd 
 created by github.com/appscode/g2/pkg/server.(*Server).Start 
 	/go/src/github.com/appscode/g2/pkg/server/server.go:170 +0x2e0 
 goroutine 65 [IO wait, 2 minutes]: 
 net.runtime_pollWait(0x7fbe42e354e0, 0x72, 0xa) 
 	/usr/local/go/src/runtime/netpoll.go:164 +0x59 
 net.(*pollDesc).wait(0xc420110148, 0x72, 0xb31780, 0xb2d450) 
 	/usr/local/go/src/net/fd_poll_runtime.go:75 +0x38 
 net.(*pollDesc).waitRead(0xc420110148, 0xc4205b0000, 0x40000) 
 	/usr/local/go/src/net/fd_poll_runtime.go:80 +0x34 
 net.(*netFD).Read(0xc4201100e0, 0xc4205b0000, 0x40000, 0x40000, 0x0, 0xb31780, 0xb2d450) 
 	/usr/local/go/src/net/fd_unix.go:250 +0x1b7 
 net.(*conn).Read(0xc42000c008, 0xc4205b0000, 0x40000, 0x40000, 0x0, 0x0, 0x0) 
 	/usr/local/go/src/net/net.go:181 +0x70 
 bufio.(*Reader).fill(0xc42014e0c0) 
 	/usr/local/go/src/bufio/bufio.go:97 +0x117 
 bufio.(*Reader).ReadSlice(0xc42014e0c0, 0xc42003db0a, 0xc42003d7f8, 0xc420024400, 0x7fbe42ec9000, 0x0, 0x0) 
 	/usr/local/go/src/bufio/bufio.go:338 +0xbb 
 bufio.(*Reader).ReadBytes(0xc42014e0c0, 0xc42014e00a, 0xc42003db48, 0xc42012c5e0, 0x2, 0x8, 0x2) 
 	/usr/local/go/src/bufio/bufio.go:416 +0x66 
 github.com/appscode/g2/pkg/server.(*session).handleAdminConnection(0xc4200ee740, 0xc42014b220, 0xb386c0, 0xc42000c008, 0xc42014e0c0, 0x1, 0xc42014e000) 
 	/go/src/github.com/appscode/g2/pkg/server/session.go:183 +0x48 
 github.com/appscode/g2/pkg/server.(*session).handleConnection(0xc4200ee740, 0xc42014b220, 0xb386c0, 0xc42000c008) 
 	/go/src/github.com/appscode/g2/pkg/server/session.go:63 +0x429 
 created by github.com/appscode/g2/pkg/server.(*Server).Start 
 	/go/src/github.com/appscode/g2/pkg/server/server.go:170 +0x2e0 
 goroutine 66 [chan receive, 2 minutes]: 
 github.com/appscode/g2/pkg/server.queueingWriter(0xc42014e000, 0xc42014e060) 
 	/go/src/github.com/appscode/g2/pkg/server/client.go:29 +0x11f 
 created by github.com/appscode/g2/pkg/server.(*session).handleConnection 
 	/go/src/github.com/appscode/g2/pkg/server/session.go:48 +0x20a 
 goroutine 67 [chan receive, 2 minutes]: 
 github.com/appscode/g2/pkg/server.writer(0xb386c0, 0xc42000c008, 0xc42014e060) 
 	/go/src/github.com/appscode/g2/pkg/server/util.go:301 +0x11a 
 created by github.com/appscode/g2/pkg/server.(*session).handleConnection 
 	/go/src/github.com/appscode/g2/pkg/server/session.go:49 +0x246 
 goroutine 9 [chan receive]: 
 github.com/appscode/g2/pkg/server.queueingWriter(0xc42014e120, 0xc42014e180) 
 	/go/src/github.com/appscode/g2/pkg/server/client.go:29 +0x11f 
 created by github.com/appscode/g2/pkg/server.(*session).handleConnection 
 	/go/src/github.com/appscode/g2/pkg/server/session.go:48 +0x20a 
 goroutine 10 [chan receive]: 
 github.com/appscode/g2/pkg/server.writer(0xb386c0, 0xc42000c028, 0xc42014e180) 
 	/go/src/github.com/appscode/g2/pkg/server/util.go:301 +0x11a 
 created by github.com/appscode/g2/pkg/server.(*session).handleConnection 
 	/go/src/github.com/appscode/g2/pkg/server/session.go:49 +0x246 

not support type PT_GrabJob

Wonder if anyone ran into the following issue:

We use kubernetes 1.10 to spin a express/node app, which in turns calls a node-gearman (simple Gearman client/worker). Here's the g2 log on kuberentes:

On register worker:
session.go:82] incoming<= sessionId: 9 protocol: PT_CanDo len(args): 1 details: target
server.go:700] worker with sessionId: 9 add function target
session.go:82] incoming<= sessionId: 9 protocol: PT_GrabJob len(args): 0 details:
session.go:176] not support type PT_GrabJob

On submit jobs
session.go:82] incoming<= sessionId: 8 protocol: PT_SubmitJobHighBG len(args): 3 details: target{"id":"5b16c353a8c11c01003839b1"}
server.go:351] wakeup sessionId 9
session.go:82] incoming<= sessionId: 9 protocol: PT_GrabJob len(args): 0 details:
session.go:176] not support type PT_GrabJob

Any ideas?

Request: additional/more specific Prometheus metrics

Right now in the Prometheus metrics export, you only get a total worker and job count. It would be really beneficial to see those broken down by the job type (function name, per the Gearman protocol), so that you can see e.g. if only a specific job type is backed up.

Dependabot couldn't find a Gopkg.toml for this project

Dependabot couldn't find a Gopkg.toml for this project.

Dependabot requires a Gopkg.toml to evaluate your project's current Go dependencies. It had expected to find one at the path: /Gopkg.toml.

If this isn't a Go project, or if it is a library, you may wish to disable updates for it from within Dependabot.

You can mention @dependabot in the comments below to contact the Dependabot team.

Define a gRPC api

Goals:

  • Define a gRPC based api for Gearman.
  • Fix the protocol issues in Gearman (#15).
  • Client protocol must be stateless and unidirectional.

Benefits:

  • Clients in many languages.
  • Authentication via HTTP.
  • Json ready client (using grpc-gateway).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.