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.62.0 (released Feb 20, 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_unary
compute_engine_creds
jwt_token_creds
oauth2_auth_token
per_rpc_creds
google_default_credentials
compute_engine_channel_credentials
,rpc_soak
channel_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 |