Service Organization
Macro’s backend uses a microservices architecture where each service is a separate Rust crate with its own:- API endpoints and handlers
- Database client (if needed)
- Business logic
- Tests and fixtures
- OpenAPI documentation
Key Services
Document Storage Service
Crate:document-storage-service
Purpose: Main API for document storage and retrieval
Responsibilities:
- Document upload and download
- File metadata management
- Integration with S3 for file storage
- Document permissions and access control
- Triggers document processing pipeline
- S3 for file storage
- SQS for triggering downstream processing
- Lambda functions for format-specific handling
Email Service
Crate:email_service
Purpose: Email processing and management
Responsibilities:
- Email thread management
- Message parsing and storage
- Email sending via SES
- Attachment handling
- Email suppression and bounce handling
email_db_client- Database access layeremail_service_client- Client for other servicesemail_utils- Shared email utilitiesmodels_email- Email data modelsgmail_client- Gmail API integration
email_suppression_handler- Handles bounce/complaint notificationsemail_refresh_handler- Periodic email synchronizationemail_scheduled_handler- Scheduled email operationsemail_sfs_delete_handler- Email deletion processing
Communication Service
Crate:comms_service
Purpose: Internal communication handling (messages, channels)
Responsibilities:
- Message creation and retrieval
- Channel management
- Participant tracking
- Real-time message delivery
- Message mentions and references
comms_db_client- Database operationscomms_service_client- Service clientchannels- Channel management logicmention_utils- Mention parsing and handling
- Works with
connection_gatewayfor WebSocket delivery - Uses
notification_servicefor push notifications
Search Service
Crate:search_service
Purpose: Full-text search across documents and content
Responsibilities:
- Query processing and ranking
- Filter application
- Faceted search
- Autocomplete suggestions
- Search analytics
search_service_client- Client interfacesearch_processing_service- Indexing pipelinemodels_search- Search data modelsopensearch_client- OpenSearch integration
search_upload_handler- Processes documents for indexing
Authentication Service
Crate:authentication_service
Purpose: User authentication and session management
Responsibilities:
- User login/logout
- JWT token generation and validation
- Session management
- OAuth integration
- API key management
authentication_service_client- Client for other servicesmacro_auth- Shared authentication utilitiesfusionauth- FusionAuth integration
- Uses Redis for session storage
- Validates tokens for all authenticated requests
Document Cognition Service
Crate:document_cognition_service
Purpose: Document analysis and AI-powered processing
Responsibilities:
- Document classification
- Entity extraction
- Content analysis
- AI-powered insights
- Document relationships
document_cognition_service_clientai- AI model integrationai_tools- AI toolinganthropic- Claude API client
Connection Gateway
Crate:connection_gateway
Purpose: WebSocket gateway for real-time communication
Responsibilities:
- WebSocket connection management
- Real-time message routing
- Presence tracking
- Connection state management
- Routes messages from
comms_service - Tracks active user connections
- Handles connection lifecycle events
Contacts Service
Crate:contacts_service
Purpose: User contact and connection management
Responsibilities:
- Contact list management
- Connection requests
- Contact search
- Contact synchronization
contacts_db_client- Database layeremail_contact_search- Email-based contact discoveryname_search- Name-based search utilities
Service Patterns
Client Crates
Most services provide a companion client crate for inter-service communication:Database Client Separation
Each service’s database access is isolated in a separate*_db_client crate:
- Enables reuse across services
- Centralizes SQL queries and migrations
- Provides typed query results
- Uses SQLx for compile-time validation
Lambda Integration
Many services use Lambda functions for:- Async processing - Long-running operations off the critical path
- Event-driven workflows - S3 triggers, scheduled tasks
- Scalability - Auto-scaling for variable workloads
docx_unzip_handler- Unzips DOCX files on uploaddocument_text_extractor- Extracts text from PDFs/documentsdelete_chat_handler- Handles async chat deletiondeleted_item_poller- Polls for items to permanently delete
Service Communication Pattern
Service Dependencies
Common dependencies across services:axum- Web frameworksqlx- Database queriestokio- Async runtimeserde- Serialization/deserializationanyhow- Error handlingtracing- Observabilityutoipa- OpenAPI documentation
Next Steps
- Database Architecture - Learn about schema management
- API Design - Understand API patterns
- Testing - Test your services