Building Real-Time Apps With Symfony2 Antonio Perić-Mažar, Locastic 24.10.2015 Symfony Camp Ukraine
@antonioperic About me • Antonio Perić-Mažar, 
 mag. ing. comp. • CEO @ Locastic • Software developer, Symfony2 • Sylius Contributor :)
 • www.locastic.com • antonio@locastic.com • twitter: @antonioperic
@antonioperic Who we are? • Locastic (www.locastic.com) • Web and mobile development • UI/UX design • Located in Split, Croatia
@antonioperic
@antonioperic What is RTA? A real-time application (RTA) is an application program that functions within a time frame that the user senses as immediate or current. The latency must be less than a defined value, usually measured in seconds. Whether or not a given application qualifies as an RTA depends on the worst-case execution time (WCET), the maximum length of time a defined task or set of tasks requires on a given hardware platform. The use of RTAs is called real-time computing (RTC).
@antonioperic
@antonioperic Use Cases • Videoconference applications, VoIP • Data Visualisations, Location tracking • Online gaming, multi-user collaboration • Community storage solutions • Some e-commerce transactions • Chatting, IM (instant messaging) • Notifications & Signalling • Activity Streams • …
@antonioperic Use Cases Real-Time == UX etc.
@antonioperic Understanding RTA • History of Realtime • LiveConnect • Http Based solutions • Comet
@antonioperic HTTP • A client requests a webpage from a server. • The server calculates the response • The server sends the response to the client.
@antonioperic Webhooks •server only •low update rates  •uni-directional - from publisher to consumer (server to server) •avg. latency •high. efficiency (for servers)
@antonioperic Polling
@antonioperic Polling • A client requests a webpage from a server using regular HTTP (see HTTP above). • The requested webpage executes JavaScript which requests a file from the server at regular intervals (e.g. 0.5 seconds). • The server calculates each response and sends it back, just like normal HTTP traffic.
@antonioperic Polling • server or client • low update rates • batched bi-directional • high latency • low efficiency
@antonioperic Long Polling
@antonioperic Long Polling • A client requests a webpage from a server using regular HTTP (see HTTP above). • The requested webpage executes JavaScript which requests a file from the server. • The server does not immediately respond with the requested information but waits until there's new information available. • When there's new information available, the server responds with the new information. • The client receives the new information and immediately sends another request to the server, re-starting the process.
@antonioperic Long Polling • server or client • avg. update rates • batched bi-directional • avg. latency • avg. efficiency
@antonioperic HTML5 Server Sent Events (SSE) / EventSource
@antonioperic HTML5 Server Sent Events (SSE) / EventSource • A client requests a webpage from a server using regular HTTP • The requested webpage executes javascript which opens a connection to the server. • The server sends an event to the client when there's new information available. • Real-time traffic from server to client, mostly that's what you'll need • You'll want to use a server that has an event loop • Not possible to connect with a server from another domain
@antonioperic HTML5 Server Sent Events (SSE) / EventSource • client (pushing) • good update rates • unidirectional • good latency • good efficiency
@antonioperic WebSockets
@antonioperic WebSockets • A client requests a webpage from a server using regular http (see HTTP above). • The requested webpage executes JavaScript which opens a connection with the server. • The server and the client can now send each other messages when new data (on either side) is available. • Real-time traffic from the server to the client and from the client to the server • You'll want to use a server that has an event • With WebSockets it is possible to connect with a server from another domain. • It is also possible to use a third party hosted websocket server, for example Pusher or others. This way you'll only have to implement the client side, which is very easy!
@antonioperic WebSockets • TCP, fully duplex single connection • server or client (client mostly) • bi-directional • high update rates • low latency • high efficiency
@antonioperic Streaming • make connection, keep it open, as soon as we have updates push it to client • server or client • high updated rates • uni-directional • low latency • high efficiency • business decisions, trading, unidirectional you can only push it from server to client, single persisting connection  • look as servers and event as standard
@antonioperic WebRTC • server or client (normally client2client) • high update rates • bi-directional • low latency • high efficiency • audio or video generally peer2peer
@antonioperic Communication patterns • Simple messaging • Pub/Sub • RPC/RMI • Data Sync
@antonioperic Simple Messaging • No abstraction. Just messages • Fits well with HTTP and REST • Many persist connections
@antonioperic Pub/Sub • Subscribe and publish on channels • Multiplexed. Single connection. • Clearity partitions complex data • Dedicated Endpoint • Required SDK
@antonioperic RPC/RMI • Call API Methods • SDK Required • Hides network activity from developer
@antonioperic Data Sync • Interact with, and synchronise, data structures • Dedicated endpoint + Protocol • New Paradigm • SDK Required • Hides network activity from developer
@antonioperic How to pick technology? • First: Are the only real time solutions in NodeJS?
@antonioperic How to pick technology? • First: Are the only real time solutions in NodeJS?
 
 
 NO!
@antonioperic Solutions by language • PHP: ReactPHP, Ratchet, dNode-php, phpDaemon • Java: Netty, Jetty • JavaScript (Node.JS): Faye, Socket.IO (Engine.IO), Primus.io • .NET (C#): SignalR, XSockets • Python: Lots of options built on Tornado • Ruby: em-websocket, Faye • Language agnostic: most hosted services
@antonioperic Solutions by language j.mp/realtime-tech-guide
@antonioperic PHP? • Apache is not built for Real-Time • PHP is not build for Real-Time • Real-Time is not impossible with PHP
@antonioperic PHP RTA • Self hosted PHP solution • Self hosted Side-by-Side solution • Hosted solution
@antonioperic Self hosted PHP • tightly coupled • two stacks: • sync stack • async stack
@antonioperic
@antonioperic PHP Self Hosted solutions • React (PHP) • Event-driven, non-blocking I/O with PHP. • Ratchet (Built on React PHP) • WebSockets, WAMP, PubSub samples. No HTTP Fallback • dnode-php (RPC/RMI) • phpDaemon • Lots of examples. Most docs in Russian.
@antonioperic
@antonioperic PHP Self Hosted solutions Pros: • PHP • Simple integration • Standards-based • WAMP/Autobahn • JS, Android, iOS & more Cons: • No HTTP fallback • Low-level abstractions • Different programming style • You need to scale
@antonioperic
@antonioperic PHP + Faye Self Hosted solutions Pros: • PubSub • Connection fallback • Redis support is build in • Simple integration Cons: • Not PHP? • You need to scale
@antonioperic Other side by side solutions • Socket.IO • SockJS • SignalR • see real time tech guide for more
@antonioperic
@antonioperic PHP + Hosted solutions Pros: • Simple and powerful • Instantly scalable • Managed & Dedicated • Direct integration into Symfony Cons: • 3rd party reliance
@antonioperic What we build? • Real time dashboards ford Google Adwords analytics • Symfony2, AngularJS, RabbitMQ • First version was with Polling • Second version moving to hosted solution - Pusher
@antonioperic Other hosted solutions • PubNub • Realtime.co • Firebase • Simperium • see real time tech guide for more
@antonioperic References • Phil @Leggetter 
 - Head of Developer Relations at @pusher. Realtime Web Technology Evangelist.
 • Real-time Tech Guide • React (PHP) • Ratchet (PHP) • Faye (Node/Ruby) • Pusher • LopiPusherBundle • github.com/leggetter/realtime-symfonyexamples
@antonioperic Thank you!
@antonioperic QA
 
 
 follow me on twitter: @antonioperic

Building real time applications with Symfony2

  • 1.
    Building Real-Time AppsWith Symfony2 Antonio Perić-Mažar, Locastic 24.10.2015 Symfony Camp Ukraine
  • 2.
    @antonioperic About me • AntonioPerić-Mažar, 
 mag. ing. comp. • CEO @ Locastic • Software developer, Symfony2 • Sylius Contributor :)
 • www.locastic.com • antonio@locastic.com • twitter: @antonioperic
  • 3.
    @antonioperic Who we are? •Locastic (www.locastic.com) • Web and mobile development • UI/UX design • Located in Split, Croatia
  • 4.
  • 5.
    @antonioperic What is RTA? Areal-time application (RTA) is an application program that functions within a time frame that the user senses as immediate or current. The latency must be less than a defined value, usually measured in seconds. Whether or not a given application qualifies as an RTA depends on the worst-case execution time (WCET), the maximum length of time a defined task or set of tasks requires on a given hardware platform. The use of RTAs is called real-time computing (RTC).
  • 6.
  • 7.
    @antonioperic Use Cases • Videoconferenceapplications, VoIP • Data Visualisations, Location tracking • Online gaming, multi-user collaboration • Community storage solutions • Some e-commerce transactions • Chatting, IM (instant messaging) • Notifications & Signalling • Activity Streams • …
  • 8.
  • 9.
    @antonioperic Understanding RTA • Historyof Realtime • LiveConnect • Http Based solutions • Comet
  • 10.
    @antonioperic HTTP • A clientrequests a webpage from a server. • The server calculates the response • The server sends the response to the client.
  • 11.
    @antonioperic Webhooks •server only •low updaterates  •uni-directional - from publisher to consumer (server to server) •avg. latency •high. efficiency (for servers)
  • 12.
  • 13.
    @antonioperic Polling • A clientrequests a webpage from a server using regular HTTP (see HTTP above). • The requested webpage executes JavaScript which requests a file from the server at regular intervals (e.g. 0.5 seconds). • The server calculates each response and sends it back, just like normal HTTP traffic.
  • 14.
    @antonioperic Polling • server orclient • low update rates • batched bi-directional • high latency • low efficiency
  • 15.
  • 16.
    @antonioperic Long Polling • Aclient requests a webpage from a server using regular HTTP (see HTTP above). • The requested webpage executes JavaScript which requests a file from the server. • The server does not immediately respond with the requested information but waits until there's new information available. • When there's new information available, the server responds with the new information. • The client receives the new information and immediately sends another request to the server, re-starting the process.
  • 17.
    @antonioperic Long Polling • serveror client • avg. update rates • batched bi-directional • avg. latency • avg. efficiency
  • 18.
    @antonioperic HTML5 Server SentEvents (SSE) / EventSource
  • 19.
    @antonioperic HTML5 Server SentEvents (SSE) / EventSource • A client requests a webpage from a server using regular HTTP • The requested webpage executes javascript which opens a connection to the server. • The server sends an event to the client when there's new information available. • Real-time traffic from server to client, mostly that's what you'll need • You'll want to use a server that has an event loop • Not possible to connect with a server from another domain
  • 20.
    @antonioperic HTML5 Server SentEvents (SSE) / EventSource • client (pushing) • good update rates • unidirectional • good latency • good efficiency
  • 21.
  • 22.
    @antonioperic WebSockets • A clientrequests a webpage from a server using regular http (see HTTP above). • The requested webpage executes JavaScript which opens a connection with the server. • The server and the client can now send each other messages when new data (on either side) is available. • Real-time traffic from the server to the client and from the client to the server • You'll want to use a server that has an event • With WebSockets it is possible to connect with a server from another domain. • It is also possible to use a third party hosted websocket server, for example Pusher or others. This way you'll only have to implement the client side, which is very easy!
  • 23.
    @antonioperic WebSockets • TCP, fullyduplex single connection • server or client (client mostly) • bi-directional • high update rates • low latency • high efficiency
  • 24.
    @antonioperic Streaming • make connection,keep it open, as soon as we have updates push it to client • server or client • high updated rates • uni-directional • low latency • high efficiency • business decisions, trading, unidirectional you can only push it from server to client, single persisting connection  • look as servers and event as standard
  • 25.
    @antonioperic WebRTC • server orclient (normally client2client) • high update rates • bi-directional • low latency • high efficiency • audio or video generally peer2peer
  • 26.
    @antonioperic Communication patterns • Simplemessaging • Pub/Sub • RPC/RMI • Data Sync
  • 27.
    @antonioperic Simple Messaging • Noabstraction. Just messages • Fits well with HTTP and REST • Many persist connections
  • 28.
    @antonioperic Pub/Sub • Subscribe andpublish on channels • Multiplexed. Single connection. • Clearity partitions complex data • Dedicated Endpoint • Required SDK
  • 29.
    @antonioperic RPC/RMI • Call APIMethods • SDK Required • Hides network activity from developer
  • 30.
    @antonioperic Data Sync • Interactwith, and synchronise, data structures • Dedicated endpoint + Protocol • New Paradigm • SDK Required • Hides network activity from developer
  • 31.
    @antonioperic How to picktechnology? • First: Are the only real time solutions in NodeJS?
  • 32.
    @antonioperic How to picktechnology? • First: Are the only real time solutions in NodeJS?
 
 
 NO!
  • 33.
    @antonioperic Solutions by language •PHP: ReactPHP, Ratchet, dNode-php, phpDaemon • Java: Netty, Jetty • JavaScript (Node.JS): Faye, Socket.IO (Engine.IO), Primus.io • .NET (C#): SignalR, XSockets • Python: Lots of options built on Tornado • Ruby: em-websocket, Faye • Language agnostic: most hosted services
  • 34.
  • 35.
    @antonioperic PHP? • Apache isnot built for Real-Time • PHP is not build for Real-Time • Real-Time is not impossible with PHP
  • 36.
    @antonioperic PHP RTA • Selfhosted PHP solution • Self hosted Side-by-Side solution • Hosted solution
  • 37.
    @antonioperic Self hosted PHP •tightly coupled • two stacks: • sync stack • async stack
  • 38.
  • 39.
    @antonioperic PHP Self Hostedsolutions • React (PHP) • Event-driven, non-blocking I/O with PHP. • Ratchet (Built on React PHP) • WebSockets, WAMP, PubSub samples. No HTTP Fallback • dnode-php (RPC/RMI) • phpDaemon • Lots of examples. Most docs in Russian.
  • 40.
  • 41.
    @antonioperic PHP Self Hostedsolutions Pros: • PHP • Simple integration • Standards-based • WAMP/Autobahn • JS, Android, iOS & more Cons: • No HTTP fallback • Low-level abstractions • Different programming style • You need to scale
  • 42.
  • 43.
    @antonioperic PHP + FayeSelf Hosted solutions Pros: • PubSub • Connection fallback • Redis support is build in • Simple integration Cons: • Not PHP? • You need to scale
  • 44.
    @antonioperic Other side byside solutions • Socket.IO • SockJS • SignalR • see real time tech guide for more
  • 45.
  • 46.
    @antonioperic PHP + Hostedsolutions Pros: • Simple and powerful • Instantly scalable • Managed & Dedicated • Direct integration into Symfony Cons: • 3rd party reliance
  • 47.
    @antonioperic What we build? •Real time dashboards ford Google Adwords analytics • Symfony2, AngularJS, RabbitMQ • First version was with Polling • Second version moving to hosted solution - Pusher
  • 48.
    @antonioperic Other hosted solutions •PubNub • Realtime.co • Firebase • Simperium • see real time tech guide for more
  • 49.
    @antonioperic References • Phil @Leggetter
 - Head of Developer Relations at @pusher. Realtime Web Technology Evangelist.
 • Real-time Tech Guide • React (PHP) • Ratchet (PHP) • Faye (Node/Ruby) • Pusher • LopiPusherBundle • github.com/leggetter/realtime-symfonyexamples
  • 50.
  • 51.