grapesy: industrial strength gRPC library for Haskell
Haskell library providing gRPC client and server.
The gRPC framework comes with a test suite that tests interoperability
between implementations as well compliance to the gRPC
specification. As the table below shows, grapesy passes all of these tests,
apart from the Open Request Cost Aggregation (ORCA) tests, which is not yet
supported by grapesy.
Legend:
- ✅ passed
- ❌ failed
- ❔ not supported by the reference (or reference does not conform to the gRPC specification)
- 🚫 not supported by
grapesy
We last tested against version v1.69.0 (released Dec 24, 2024).
| Test | Python | C++ | Go | Java | grapesy |
|---|---|---|---|---|---|
cancel_after_begin |
✅ | ✅ | ✅ | ✅ | ✅ |
cancel_after_first_response |
✅ | ✅ | ✅ | ✅ | ✅ |
client_compressed_streaming |
❔ | ✅ | ❔ | ✅ | ✅ |
client_compressed_unary |
❔ | ✅ | ❔ | ✅ | ✅ |
client_streaming |
✅ | ✅ | ✅ | ✅ | ✅ |
custom_metadata |
✅ | ✅ | ✅ | ✅ | ✅ |
empty_stream |
✅ | ✅ | ✅ | ✅ | ✅ |
empty_unary |
✅ | ✅ | ✅ | ✅ | ✅ |
large_unary |
✅ | ✅ | ✅ | ✅ | ✅ |
orca_oob |
🚫 | 🚫 | 🚫 | 🚫 | 🚫 |
orca_per_rpc |
🚫 | 🚫 | 🚫 | 🚫 | 🚫 |
ping_pong |
✅ | ✅ | ✅ | ✅ | ✅ |
server_compressed_streaming |
❔ | ✅ | ❔ | ✅ | ✅ |
server_compressed_unary |
❔ | ✅ | ❔ | ✅ | ✅ |
server_streaming |
✅ | ✅ | ✅ | ✅ | ✅ |
special_status_message |
✅ | ❔ | ✅ | ✅ | ✅ |
status_code_and_message |
✅ | ✅ | ✅ | ✅ | ✅ |
timeout_on_sleeping_server |
✅ | ✅ | ✅ | ✅ | ✅ |
unimplemented_method |
✅ | ✅ | ✅ | ✅ | ✅ |
unimplemented_service |
✅ | ✅ | ✅ | ✅ | ✅ |
| Test | Python | C++ | Go | Java | grapesy |
|---|---|---|---|---|---|
cancel_after_begin |
✅ | ✅ | ✅ | ✅ | ✅ |
cancel_after_first_response |
✅ | ✅ | ✅ | ✅ | ✅ |
client_compressed_streaming |
❔ | ✅ | ❔ | ❔ | ✅ |
client_compressed_unary |
❔ | ✅ | ❔ | ❔ | ✅ |
client_streaming |
✅ | ✅ | ✅ | ✅ | ✅ |
custom_metadata |
✅ | ✅ | ✅ | ✅ | ✅ |
empty_stream |
✅ | ✅ | ✅ | ✅ | ✅ |
empty_unary |
✅ | ✅ | ✅ | ✅ | ✅ |
large_unary |
✅ | ✅ | ✅ | ✅ | ✅ |
orca_oob |
🚫 | 🚫 | 🚫 | 🚫 | 🚫 |
orca_per_rpc |
🚫 | 🚫 | 🚫 | 🚫 | 🚫 |
ping_pong |
✅ | ✅ | ✅ | ✅ | ✅ |
server_compressed_streaming |
❔ | ✅ | ❔ | ❔ | ✅ |
server_compressed_unary |
❔ | ✅ | ❔ | ✅ | ✅ |
server_streaming |
✅ | ✅ | ✅ | ✅ | ✅ |
special_status_message |
✅ | ✅ | ✅ | ✅ | ✅ |
status_code_and_message |
✅ | ✅ | ✅ | ✅ | ✅ |
timeout_on_sleeping_server |
✅ | ✅ | ✅ | ❔ | ✅ |
unimplemented_method |
✅ | ✅ | ✅ | ✅ | ✅ |
unimplemented_service |
✅ | ✅ | ✅ | ✅ | ✅ |
There are additional tests that are not supported by grapesy, but since these
are not supported by any of the reference implementations that we tested, we
did not consider them any further. The full list is:
cacheable_unarychannel_soakcompute_engine_channel_credentialscompute_engine_credsconcurrent_large_unarygoogle_default_credentialsjwt_token_credslong_lived_channeloauth2_auth_tokenper_rpc_credsrpc_soak
Screenshots of the "Area Chart" display of the
eventlog2html output for
selected RPC communication patterns.
Client opens many connections and does a single non-streaming RPC.
Client profile:
Server profile:
Client opens a single connection and does many RPCs.
Client profile:
Server profile:
Client opens a single connection and does a single RPC that sends many messages.
Client profile:
Server profile:
| Run type | Linux (RPCs/s) | OSX (RPCs/s) | ||
| Grapesy | Java | Grapesy | Java | |
| sequential protobuf | 4654.500 | 7169.283 | 2919.783 | 1907.350 |
| concurrent protobuf | 3326.283 | 10908.650 | 5032.950 | 4571.750 |
| sequential json | 2371.233 | 2427.900 | 909.417 | 1574.817 |
| concurrent json | 3019.733 | 6143.567 | 1151.017 | 3563.867 |





