Evolving an Actor Library Based on Lessons Learned from Large-Scale Deployments - Benjamin Hindman

Discover how an actor library was evolved from futures and promises to non-blocking, parallel execution, avoiding locking and synchronization issues, and gaining key insights from large-scale deployments.

Key takeaways
  • Evolution of actor library:
    • Started with futures and promises, which led to locking and performance issues
    • Migrated to actors, which enabled non-blocking, parallel execution
    • Key insight: actors can be seen as execution resources, not threads
  • Lessons learned:
    • Be cautious when using callbacks, as they can lead to complex code
    • Favor non-blocking approaches for large-scale systems
    • Actors can be used to avoid locking and synchronization issues
    • Futures and promises are essential for actor-based systems
  • Actor design:
    • Actors receive and handle messages in a non-blocking way
    • Actors can call other actors and functions, returning futures
    • Actors can be composed to achieve complex behavior
  • Challenges:
    • Handling synchronization and locking in actor-based systems
    • Ensuring determinism and reproducibility in actor systems
    • Managing memory and state in actor systems
  • Conclusion:
    • Actors and futures/promises can be a powerful combination for building scalable, non-blocking systems
    • Be careful when introducing new concepts, such as actors, and ensure they fit with existing abstractions
    • Consider the trade-offs between simplicity, performance, and complexity when designing systems