Don't Use Websockets (Until You Try This…)

Поделиться
HTML-код
  • Опубликовано: 17 дек 2022
  • Using websockets increases the code and infrastructure complexity of your app, especially as you scale horizontally. Depending on your needs, you may be able to use Server Sent Events (SSE) instead. Server Sent Events is more efficient than polling, but simple to implement on both the backend and frontend.

Комментарии • 246

  • @codewithryan
    @codewithryan  Год назад +88

    Note: Depending on your specific project, using SSE you may still result into the same horizontal scaling challenges as WS (e.g. sticky sessions/central sessions store). It entirely depends on what kind of feature you’re implementing and how you're moving data around. But I’ve found that SSE provides a simpler base to implement realtime functionality if the client is mostly just receiving updates.
    Someone made a highly scaled MMO game with SSE: news.ycombinator.com/item?id=30312897
    ^^^ That thread also includes some interesting discussions around SSE.
    Here's a performance comparison between SSE and WS (spoiler alert: both are pretty much the same): www.timeplus.com/post/websocket-vs-sse

    • @DonDregon
      @DonDregon Год назад +7

      Using SSE you are limited to 4 tabs on the client side plus the client-to-server comm is -usually- made through HTTP requests. SSE are meant to be a better way to solve push notifications, on any other real-time use-case, WS will do a way better job.
      Cheers!

    • @cedricopese
      @cedricopese Год назад

      @@DonDregon Clear, simple and smart. Thanks

    • @IsaacShoebottom
      @IsaacShoebottom Год назад

      O poor

    • @dyto2287
      @dyto2287 Год назад +8

      @@DonDregon You are like 8 years outdated about this. This limitation is only for HTTP/1. If you use HTTP/2 you can have thousands of SSE connections concurrently on same browser. If you use firewall proxy like CloudFlare that exposes your HTTP/1 backend as HTTP/2 you already get that and this connection limit is not relevant for you.
      As for replacing WS with SSE - it can be done but useful for stuff like when you receive more messages from server than you send. Because to do a mutation or a change on server you would make a REST call and then server would broadcast that change via SSE connections. And it is way more scaleable since you can scale and architecture client side requests endpoints as any REST API.
      On additional note, if you use WS on phone while connected to mobile data, it will drain phone battery faster than SSE because of the nature of connection. To maintain sending stream on WS phone keeps another antenna feature turned on for sending data which drains battery quick. So SSE is usually preferred for mobile app if it can fit your needs.

    • @OzzyTheGiant
      @OzzyTheGiant 11 месяцев назад

      @@DonDregon Why would anyone even need more than 4 tabs for the same content? I fail to see a use case where this is even necessary, but yes SSE is meant for receiving notifications or data updates from the server.

  • @dabbopabblo
    @dabbopabblo Год назад +8

    I swear to god EVERYthing you talk about is soo god damn relevant to what Im working on at any given time. I am so glad I discovered this channel

  • @user-hs2zb2ty3f
    @user-hs2zb2ty3f Год назад +19

    SignalR covers all the scenarios you mentioned. By default it will try to use web sockets and gracefully fall back to the other transport types. However you can configure it to use a specific transport type. Just remember, with WS and SSE, you may have to explicitly configure routers

  • @funnycompilations8314
    @funnycompilations8314 Год назад +11

    just found your channel (by searching for the differences between Rust and Go) and I must say that your channel is totally underrated. There are many channels with 500k+ subs out there that don't even match the quality this channel has. I also like the simplicity of the channel. I go walking quite often and I can listen to your videos on my headphones because I can understand most of the things just from listening to your voice. Keep up the good work and please make more videos like this where you go through some "slides" and explain/compare things.

  • @CameronFlint07
    @CameronFlint07 Год назад +4

    Today I learned! I didn’t know there was an intermediate solution to server-side push between polling and websockets. Great presentation of the options too. Thanks!

  • @jochemmm
    @jochemmm Год назад +3

    I'm getting into Go and microservices, so I really enjoy your content. Very well explained and enjoyable to watch.

  • @lavenir9907
    @lavenir9907 Год назад +52

    Hello, thanks for mentioning this technology. This is a good way to get simple one-way events like "server to client", but in most cases, when an application moves to an event-based messaging model, SocketIO or WebRTC is used. SocketIO has a wonderful fallback mechanism for older browsers that uses pooling. At the same time, WebRTC allows you to set up a fast exchange model + additional sugar for working with video, audio and text streams.

    • @ighsight
      @ighsight 10 месяцев назад

      Underrated comment. Which of these approaches is best for push notifications?

    • @lavenir9907
      @lavenir9907 10 месяцев назад +1

      @@ighsight idiomatic way for push notifications - Push API

  • @paulgaiduk709
    @paulgaiduk709 Год назад +1

    damn Ryan, you are just plain awesome! I came to your channel by just searching YT for videos on websockets and because your were so high in the search result list I thought you have some big production with videos on every possible topic. But no! I see you just recently started the channel and all the videos you made sound super interesting! No bs, only interesting topics, only interesting tech. I promis you I'm gonna watch them all. good luck with the channel!

  • @seanweber4252
    @seanweber4252 Год назад

    Hey man I really liked the vid. It's clear that you've put some thought into what makes a clear, concise instructional video and I plan on checking out your other videos now!

  • @whamer100
    @whamer100 Год назад +1

    wow ive never heard of SSE before, i was just about to start making a project that eas going to need server -> client communication and didn't want to deal with th3 complexity of websockets; this is perfect! great video as well

  • @cirosobral
    @cirosobral 11 месяцев назад

    Man, what a great voice! Just found your channel and I'm listening just because it sounds incredible. Keep up with the good job.

  • @mrmagnetic927
    @mrmagnetic927 Год назад

    Outstanding job. TIL about SSE and this video definitely explained the process very well. PROUD of YOU

  • @cellocarlos
    @cellocarlos Год назад

    You are awesome! I've heard about SSE but never knew how actually do that. Thank you, bro!

  • @bastian9945
    @bastian9945 Год назад +1

    I just watched this on 1.5x and the Quality and Structure of the Information was superb, keep it that way

  • @Gandalf_Le_Dev
    @Gandalf_Le_Dev Год назад +3

    A very good video, good theory with diagrams and a technical example. All of this in under 10 minutes ! Very impressed and I learned a lot, thanks

  • @Thegamecheats
    @Thegamecheats Год назад +10

    Interesting I do think that websockets are going to be a lot cleaner in the code and require less data to be sent between, you are going to run into similar issues with both Server-Side events and Websockets when scaling, at least with websockets its better documented and understood. But I do like how you pointed out some differences and I think its good to understand and know as many options as possible.
    What I would be interested in is a way to communicate between a server and client using no javascript, something like long-polling. This would be great for people who use TOR and aren't using javascript because of privacy and security concerns. I have seen some interesting solutions to this but so far nothing very clean.
    Would be huge for privacy and security people if someone found a solution to this. I imagine an instant chat application that ran securely through TOR with no javascript would be pretty huge.

  • @LegitoTV
    @LegitoTV 6 месяцев назад

    Hi! I just found your channel via the GTA 3 code review. Great stuff sir thank you for sharing your knowledge.

  • @danielgilleland8611
    @danielgilleland8611 Год назад +1

    Kudos for talking about this little-known/little-used feature for us web developers!

  • @BenGamble
    @BenGamble Год назад +76

    There's nothing actually wrong with the statefulness of websockets. Most load balancers can do this already and maintain a sticky session for you. When you start streaming with SSE, you've still got state to manage for reconnects (offsets etc). Similar with seasons beyond even basic complexity. There's a lot of tools like Ably, Pusher and others that manage all of this state for you, handling the scale out. A websocket is full TCP connection with a bit of extra framing. You can send binary data without having to move to HTTP/2 (which is still less supported that it should be)

    • @viniciusataidedealbuquerqu2837
      @viniciusataidedealbuquerqu2837 Год назад +3

      you can also apply a queue for handling indirect connections, you can always reconnect with the queue and the history will be secure between the server instances

    • @deathbombs
      @deathbombs 10 месяцев назад +1

      websockets are also easy to reopen so even if it's stateless it won't be a big issue

    • @AmanGupta_Dev
      @AmanGupta_Dev 9 месяцев назад +1

      Thanks! I learned something new today.

    • @TikTokOwnsU
      @TikTokOwnsU 5 месяцев назад

      What's wrong with it is websockets are overkill for certain applications which I feel he did a good enough overview of the reasons why. Adding even more complexity doesn't really change this.

  • @cod3a
    @cod3a Год назад +5

    Dude, you have a gift for explaining IT concepts in a very simple way. love it

  • @robkom
    @robkom Год назад +73

    Great video! You refer to SSE as "server-side events" but it seems it's officially referred to as "server-sent events". Knowing the difference between short vs long polling might also be useful.

    • @codewithryan
      @codewithryan  Год назад +12

      Good catch 😂

    • @bossgd100
      @bossgd100 11 месяцев назад +1

      maybe you should create your youtube channel also lol

    • @petarsworld
      @petarsworld 8 месяцев назад

      @@codewithryan TPC = TCP grammar mistake at the beginning :)

  • @Cyber_Lanka
    @Cyber_Lanka Год назад

    awesome video Ryan. I wasn't aware of SSE until this.

  • @dabbopabblo
    @dabbopabblo Год назад

    Woah this is so fitting for the live stream event system Im implementing for time based user reactions and vote/polling

  • @Ma1ne2
    @Ma1ne2 Год назад

    I had NO idea this exists, this is such a cool mechanism, thank you very much for sharing!

  • @justadude8716
    @justadude8716 9 месяцев назад

    This is a very informative video, short and to the point!

  • @intervalia
    @intervalia 9 месяцев назад

    Great video. I didn't know about server-side events yet.
    Thanks for the info.

  • @tashima42
    @tashima42 Год назад

    Awesome video, keep it up Ryan, learned a lot from you.

  • @everythinggoes850
    @everythinggoes850 Год назад +91

    Underrated communical channel. In fact, most apps should adopt SSE instead of websockets.

    • @julienr8114
      @julienr8114 11 месяцев назад +2

      why ? What is the avantage of SSE vs Websockets ?

    • @keremardicli4013
      @keremardicli4013 10 месяцев назад +2

      It is very costly for the server compared to ws, and it is one way only.

    • @isaacvr
      @isaacvr 9 месяцев назад +1

      I don't see it very practical. Is like having two arrays, one for age and other for name to represent a list of users, instead of using a class. With SSE you have one-direction stream + post (two event sources). With websockets you have a single source of events. Simpler, cleaner and bidirectional.

  • @hanswoast7
    @hanswoast7 Год назад

    That was a great overview. Thanks Ryan!

  • @DejayClayton
    @DejayClayton 10 месяцев назад

    Nice overview. For completeness, you should also cover long-polling, which was the popular solution before WebSocket (singular, not plural).

  • @foreveryoung6108
    @foreveryoung6108 Год назад

    This is the best introdution for Websockets, awesome.

  • @RK-on4si
    @RK-on4si Год назад

    Great video, very informative. Your insights were incredibly valuable.

  • @TikTokOwnsU
    @TikTokOwnsU 5 месяцев назад

    Good explanation. I love when people explain why NOT to use something instead of just assuming. Only non standard thing you're using here is "GO" not sure if this is necessary or not.

  • @BrainInteractive
    @BrainInteractive Год назад

    This is so cool, I did not know this even existed in HTTP until now, thanks!

  • @arson5304
    @arson5304 Год назад

    legendary content, never heard of server side http events before

  • @twomtyler
    @twomtyler 2 месяца назад

    Great explanations and summary of the different options. Thanks a bunch

  • @gaiusify
    @gaiusify 3 месяца назад

    Hey Ryan thanks for this video! Do you answer questions over emails?

  • @JorneDeSmedt
    @JorneDeSmedt 6 месяцев назад

    Well, I'm mailing this video to my work email.
    I needed this months ago.

  • @JohnZakaria
    @JohnZakaria Год назад

    At first I thought clickbait but then the video was 100% legit quality content.

  • @GrzesiuG44
    @GrzesiuG44 Год назад +11

    If nothing chaged, both pooling and SSE suffer from being included in the count of connections to same host. With browsers limiting their count to 6 by default this was a serious reason to avoid both of them and using websockets instead.

    • @jaagup
      @jaagup 10 месяцев назад

      Chrome I think limits only http 1.1 requests to 6. With http 2 and 3 it can do more.

  • @benlovell9416
    @benlovell9416 9 месяцев назад

    doesn't this move the state of the open connection from an explicit data store to the HTTP server's thread pool?

  • @azizutkuozdemir
    @azizutkuozdemir 8 месяцев назад

    Super valueable .thanks

  • @BraisonsCrece
    @BraisonsCrece Год назад

    Really interesting! Thanks for sharing. I love the way you teach. New subscriber! 👌👏🎉

  • @amirp3487
    @amirp3487 Год назад

    Well explained, thanks Ryan!

  • @OverMartinez
    @OverMartinez 11 месяцев назад

    Nice video and nice approach!
    Do you think if there is a similar implementation using nodejs instead of Go?

  • @akmzahidulislam2764
    @akmzahidulislam2764 Год назад

    Great video, boss! Keep it up!

  • @ooslik
    @ooslik 10 месяцев назад

    This was a really helpful video man. Thanks!

  • @kevintanudjaja7597
    @kevintanudjaja7597 Год назад +4

    If I remember, Google Sheets is implemented using Long Request, no-polling strategy. That's insane considering they can do real-time collaboration at that time without websocket

  • @yss64
    @yss64 Год назад +1

    Very insightful video. Thanks!

  • @yankluf
    @yankluf 11 месяцев назад

    Woow! Excellent video!! It resolved all my doubts and muuch more! Thanks!! 😁😁

  • @neozes
    @neozes 3 месяца назад

    Good stuff mate! Thanks!

  • @n0kodoko143
    @n0kodoko143 Год назад

    Glad I found this!! Awesome stuff

  • @avithedev
    @avithedev Год назад

    Love being an early subscriber to a channel that I know will blow

  • @maciejkag2735
    @maciejkag2735 6 месяцев назад

    damn this would really help with my current project! im trying to avoid websockets and i dont need client->server communication so thanks a lot!!!

  • @verified_tinker1818
    @verified_tinker1818 Год назад +4

    I have to point out the elephant in the room: the Phoenix framework. Since it (well, the language and runtime) is based on the actor model, it's fantastic at scaling horizontally, and the statefuless of WebSockets (which it uses extensively) make some things a lot easier; not to mention more efficient, because you don't need to send/receive a whole HTTP request, only the relevant data.

    • @nubunto
      @nubunto Год назад

      I love phoenix and elixir, but what I don’t like is having to be tied up to the BEAM. I’m also honestly not very good at it too, so that might play a big role 😅

  • @HollywoodCameraWork
    @HollywoodCameraWork Год назад +18

    The statefulness of websockets is a feature, not a bug. It allows you to do rigorous authentication once at the front-end API, creating a trusted channel where messages passed to back-end services side-load authentication information that cannot be user-provided, so they don't have to re-do authentication. This creates a single place where authentication happens, and not every single API endpoint on every single back-end node. Eventually something goes wrong if every endpoint is responsible for authentication, and the API becomes porous.

  • @novailoveyou
    @novailoveyou 11 месяцев назад

    Really nice videos bro thank you!

  • @williamgomez6226
    @williamgomez6226 5 месяцев назад

    Very good speech. Very well spoken!

  • @frontend_ko
    @frontend_ko Год назад

    okay understood, clear explanation and clear voice, thanks!

  • @priyankverma7434
    @priyankverma7434 4 месяца назад

    I really needed this
    Thanks a lot for a fab video tutorial.

  • @dragonzhao433
    @dragonzhao433 6 месяцев назад

    from the graph at end of video looks like websocket is the best way for fast read/write? if so why we not using it for push notification and rather use SSE in most cases?

  • @Gaivs
    @Gaivs Год назад

    I wish I'd seen this video earlier, it would probably have made a previous project of mine easier, especially to get a prototype going... WebSockets was pretty difficult to get going for a non-web-dev, both for frontend and backend... Oh well, now I have a new tool in my belt if I ever have to do something similar again 😅

  • @m12652
    @m12652 Год назад

    Excellent! Thanks very much 👍

  • @themarksmith
    @themarksmith Год назад

    Thank you, Ryan,
    This excellent video has given me a lot to think about - I need to implement real-time, bi-directional and encrypted communication between a client and server app and I am planning to create the production backend using Golang (currently Python) - the existing client app uses Java and it connects to the server via AMQP, but I am able to edit the clients connection method as needed...
    I currently have things working (unencrypted) on my LAN using AMQP - but I want the server to sit on the internet and allow distributed clients to connect over the web...
    I was thinking that WebSockets would be the way to go but having seen this video I am now not so sure... I am a bit of a noob so please forgive my ignorance - having watched your vid, I did a search and saw that I can actually encrypt AMQP messages between the client and server so I am now thinking 'why not do this over the internet' rather than swapping out the transport method for a more 'web focused' tech, which was what I thought I would have to do...
    Can you see any probs with using encrypted AMQP messages over the web, or do you think that switching out the connection method from AMQP to SSE/Websockets would still be a good idea?
    The messages between the client and server will contain 'alpha/numeric' data and I need the transport between endpoints to be encrypted and take place as fast as possible...
    I realise I may be being a bit cheeky here, in asking you this, but I like your channel and the way you explain things - so if you don't give a direct answer to this question here, then it may give you some ideas for a future vid, which could be helpful...
    Anyways, thanks again for what you do - I hope to see your channel really grow in 2023 as I think you deserve it!

    • @codewithryan
      @codewithryan  Год назад +2

      Hey Mark, I’m not familiar with AMPQ, but I’ll gladly chat with you about this and go through some ideas. DM me on twitter @ryancodez

  • @lokeshstufs
    @lokeshstufs Год назад +2

    There are browser based limitation with SSE. Specially when u use TLS 1.2 or less. It limits the number of parallel connection. The user can't have more than 5 tabs open per application.

  • @alexdith9024
    @alexdith9024 Год назад

    just won my sub..awesome content and really explainative.. thanks!

  • @fille.imgnry
    @fille.imgnry 8 месяцев назад

    I want to try this out!

  • @alnahian2003
    @alnahian2003 6 месяцев назад

    bro u just got a new sub 🎉

  • @avidcaster
    @avidcaster 11 месяцев назад

    Your voice is great for movies. Excellent videos.
    Client has 10 screens.
    If user triggers any changes they see the response.
    Server keeps enum for 10 screens. If any user info is changed indirectly,server updates the enum list accordingly.
    On every request the enums are sent in the header.
    Client sees a change of enums from last value. Then it makes a request for updated data.
    Client is one request behind the server. Any requests will update everything if in focus.

  • @jaymartinez311
    @jaymartinez311 Год назад

    Not sure if I know what I’m talking about (jr dev) but wouldn’t elixir work in the cases you mention to whip up multiple processes?

  • @anfytrion
    @anfytrion Год назад

    Honestly, great video... I often forget that SSE exist until I dream a solution with SSE

  • @realderek
    @realderek Год назад

    Great video. In the example of a chat app, what if there are multiple chat rooms? Can server side events “subscribe” to one channel like we sockets?

  • @PouyaAtaei
    @PouyaAtaei Год назад

    thanks for sharing!

  • @ericisawesome476
    @ericisawesome476 Год назад

    This was informative, thank you

  • @subhadipghorui2216
    @subhadipghorui2216 Год назад

    Thanks for the video.
    I am working on a big data project. I need to show around 2,00,000 dataset, result http time out error and mysql dumped the query.
    I was thinking to use websocket events to send prices of chunk data to browser asynchronously. Let me know if we can use that in there

  • @Fingiorstyle
    @Fingiorstyle Год назад

    Oh my gosh, great tutorial!

  • @fabiansvensson9588
    @fabiansvensson9588 3 месяца назад +1

    How does SSE solve the horizontal scaling problem? The server still needs to keep track of what client to send the data to right?

  • @codelinx
    @codelinx 11 месяцев назад

    Such good info and tutorials

  • @elementotriplo4966
    @elementotriplo4966 Год назад

    Server side events, i didn't know it worked, when i heard about it i thought it was just long pooling. But in long pooling if i'm not mistaken each time the server answers the client needs to immediately send another request, with server server event the client just stays connect, that's cool, thank you!

  • @tesla1772
    @tesla1772 Год назад +2

    Most of the time if bi directional communication is read heavy we can get away with SSE and a post method. But horizontal scaling will still remain an issue we'll need something like redis pub sub to gossip events between servers

    • @giuliopimenoff
      @giuliopimenoff Год назад

      RabbitMq for a more reliable approach imo

  • @ashajjar
    @ashajjar 11 месяцев назад

    Is there any security down sides of Server Side Events approach?

  • @danielngobe3057
    @danielngobe3057 3 месяца назад

    work of art

  • @ChristianBuratto
    @ChristianBuratto Год назад

    Would this solution also bind the browser client to a specific server instance that has the connection open? If so, wouldn't it cause trouble for autoscaling?

  • @timucinbahsi445
    @timucinbahsi445 Год назад

    does it switch api servers during the communication though? i don't see how it's any less stateful than a websocket. you have a single long ass communication where the server knows the state thereof. you may authenticate with a user, you may not
    i definitely see how it's simpler though. super easy to implement and it should cover a good portion of the use cases.
    what excites me more than either of these is webrtc. webrtc is capable of setting up peer to peer connections between clients. it doesn't necessarily transfer just media streams. it can make up for the absence of UDP regarding multiplayer gaming on browsers with a specialized framework

  •  Год назад

    Dude, great voice! You should be on Radio!!

  • @akshaysarbhukan6701
    @akshaysarbhukan6701 Год назад

    Great explanation! One question, how do we scale server sent events? How do we ensure that no message gets lost if a client closes the connection? Can we apply the same logic of scaling web sockets to sse as well?

    • @miquelvazquez4544
      @miquelvazquez4544 Год назад

      SSE protocol has a header to soecify the last processed event, it can be specified on case the connection is lost and server can backfill

  • @Fs3i
    @Fs3i Год назад +2

    It's server-sent events, not server side events. See, for example, section 9.2 of the whatwg html standard (current version of the living standard as of this comment).
    And despite using SSE, I'm not sure if I agree with your advantages. The main advantage of using EventSource over WebSocket is, at least to me, that EventSource does its own connection management. If the connection drops because of a transport-layer issue (e.g. client lsot internet temporarily because mobile networks), EventSource reconnects automatically. It doesn't reconnect always (e.g. if the sends 204, or, iirc, in some implementations if the server sends 5xx status codes), but for most "normal" failures it handles its own connection management, which is neat! Especailly, if you're using a library for SSE on server, then it can happen entirely automatically.
    Also, every implementation of a LB for WS I've seen has had the sessions "stick" to one API server anyway (by virtue of keeping the TCP connection alive), because otherweise things go crazy, but if you have any resources for an implementation that *doesn't*, I'd be very interested.
    Also, the "slow writes" might not even neccessarily be true if you're keep-aliving a connection the browser can reuse, or if you're using HTTP2, writes would be just as fast. The bigger problem I'd see is that they're not attached to a websocket session. If you're (for example) developing a game, it's utterly helpful if you have the paradigm of "one socket per user", it reduces the mental load to know which specific instance has sent which message, etc. (On the other hand, even with http2, I might be worried about the overhead of very small messages)
    On the other hand, it can be an advantager. e.g. for an application like discord it *doesn't* matter which specific client has deleted a message in a chatroom, just that they're authenticated.

  • @bgbrunocom
    @bgbrunocom 6 месяцев назад

    Q) is it right way secure split user communication with different " WS channels " ? is there some authentication for verification owner ?

  • @codecaine
    @codecaine Год назад

    Excellent content

  • @Felipe-53
    @Felipe-53 Год назад

    Awesome video!

  • @user-nw7jo5xw9x
    @user-nw7jo5xw9x 11 месяцев назад

    on frontside, if the connection drop (for eg: user switch the wifi) will the EventSource re-connect automatically? or we need to handle this case ourself? and how?

  • @ricardoalcantara5846
    @ricardoalcantara5846 Год назад

    Thank you sir! I was extremely didactic.

  • @v0xl
    @v0xl Год назад

    Rocket (rust web framework) has awesome support for SSE!

  • @flylord4361
    @flylord4361 Год назад

    Hey, so weird question. would it be possible when sending serverside request, to ask the server to treat the client as a server where the server may receive data from the client in a semi continues fashion?

  • @fernandosangopanta1498
    @fernandosangopanta1498 Год назад

    It is correct to use Websocket to create a audio transmition application?

  • @mariumbegum7325
    @mariumbegum7325 Год назад

    fantastic video!

  • @bnortman68
    @bnortman68 Год назад

    Thanks so much very helpful😀

  • @feelfreetofee
    @feelfreetofee Год назад

    Amazing video!

  • @JMCV2
    @JMCV2 Год назад

    I've used gRPC with HTTP2 (and Envoy proxy) for bidirectional communication

  • @mikopiko
    @mikopiko Год назад

    Very well explained