Packages
snakepit
0.5.1
0.13.0
0.12.0
0.11.1
0.11.0
0.10.1
0.10.0
0.9.1
0.9.0
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.2
0.1.1
0.1.0
High-performance pooler and session manager for external language integrations. Supports Python, Node.js, Ruby, and more with gRPC streaming, session management, and production-ready process cleanup.
Current section
Files
Jump to
Current section
Files
docs/GRPC_QUICK_REFERENCE.md
# gRPC Integration Quick Reference
## Current State Summary
### What Works ✅
- Protocol buffer definitions complete
- Python gRPC server fully implemented
- Elixir worker/adapter structure ready
- Documentation and examples complete
### What's Missing ❌
- Pool manager doesn't know about GRPCWorker
- No actual gRPC client calls (only placeholders)
- Streaming API not exposed in public interface
- No Elixir protobuf code generation
## Critical Integration Points
### 1. Worker Type Selection (HIGHEST PRIORITY)
**File**: `lib/snakepit/pool/pool.ex`
```elixir
# Current (always uses standard worker):
defp start_worker(worker_id) do
Worker.Starter.start_link(worker_id: worker_id)
end
# Needed:
defp start_worker(worker_id) do
adapter = Application.get_env(:snakepit, :adapter_module)
worker_module = if adapter.uses_grpc?() do
GRPCWorker
else
Worker
end
worker_module.start_link(id: worker_id, adapter: adapter)
end
```
### 2. Public API Streaming Methods
**File**: `lib/snakepit.ex`
```elixir
# Add these functions:
def execute_stream(command, args, callback, opts \\ [])
def execute_in_session_stream(session_id, command, args, callback, opts \\ [])
```
### 3. gRPC Client Implementation
**File**: `lib/snakepit/adapters/grpc_python.ex`
Replace placeholder functions:
```elixir
# Current:
defp make_grpc_call(_channel, _method, _request) do
{:error, "gRPC client not implemented yet"}
end
# Needed:
def grpc_execute(connection, command, args, timeout) do
Snakepit.GRPC.Client.execute(connection.channel, command, args, timeout)
end
```
### 4. Pool Request Routing
**File**: `lib/snakepit/pool/pool.ex`
```elixir
# Add worker type detection:
defp execute_on_worker(worker_pid, command, args, timeout) do
case get_worker_type(worker_pid) do
:grpc -> GRPCWorker.execute(worker_pid, command, args, timeout)
:standard -> Worker.execute(worker_pid, command, args, timeout)
end
end
```
## Implementation Checklist
### Day 1: Foundation (4-6 hours)
- [ ] Generate Elixir protobuf code
- [ ] Create Snakepit.GRPC.Client module
- [ ] Update GRPCPython adapter to use real client
- [ ] Add `uses_grpc?/0` to adapter behavior
### Day 2: Integration (4-6 hours)
- [ ] Update Pool to support worker type selection
- [ ] Update WorkerSupervisor for dynamic worker type
- [ ] Add streaming methods to public API
- [ ] Fix GRPCWorker initialization
### Day 3: Testing & Polish (2-4 hours)
- [ ] Integration tests for gRPC execution
- [ ] Streaming tests with callbacks
- [ ] Performance benchmarks
- [ ] Error handling improvements
## Key Files to Modify
1. **Pool Manager** (`lib/snakepit/pool/pool.ex`)
- Add worker type detection
- Support streaming execution
- Route requests to appropriate worker type
2. **Worker Supervisor** (`lib/snakepit/pool/worker_supervisor.ex`)
- Dynamic worker module selection
- Pass adapter to worker initialization
3. **Public API** (`lib/snakepit.ex`)
- Add `execute_stream/4`
- Add `execute_in_session_stream/5`
- Check adapter capabilities
4. **gRPC Adapter** (`lib/snakepit/adapters/grpc_python.ex`)
- Remove placeholder implementations
- Use real gRPC client
- Implement `uses_grpc?/0`
5. **gRPC Worker** (`lib/snakepit/grpc_worker.ex`)
- Fix server startup
- Proper connection initialization
- Health check implementation
## Testing the Integration
### Quick Smoke Test
```elixir
# Configure gRPC
Application.put_env(:snakepit, :adapter_module, Snakepit.Adapters.GRPCPython)
# Test basic execution
{:ok, result} = Snakepit.execute("ping", %{})
# Test streaming
Snakepit.execute_stream("ping_stream", %{count: 3}, fn chunk ->
IO.inspect(chunk)
end)
```
### Verify Worker Type
```elixir
# Check if pool created correct worker type
workers = Registry.select(Snakepit.Pool.Registry, [{{:"$1", :"$2", :"$3"}, [], [:"$2"]}])
Enum.each(workers, fn pid ->
IO.puts("Worker: #{inspect(Process.info(pid, :registered_name))}")
end)
```
## Common Pitfalls to Avoid
1. **Don't break existing workers** - Use feature detection, not hard switches
2. **Handle missing gRPC gracefully** - Check if GRPC module is loaded
3. **Preserve pool semantics** - GRPCWorker should behave like Worker from pool's perspective
4. **Test concurrent streams** - Ensure multiple streams can run simultaneously
5. **Monitor port allocation** - Prevent port conflicts with proper range management
## Success Indicators
1. `mix test` passes with both adapter types
2. Streaming demo runs without errors
3. Can switch adapters at runtime
4. Performance benchmarks show gRPC benefits
5. Health checks report accurate status
---
**Remember**: The architecture is solid. You're just connecting pipes that already exist.