MobileVet 16 hours ago

I wish this discussed the timing arbitration of each move. Based on the packet information (if that is correct & complete) then the timing is done entirely on the clients. However, they show the time in seconds which can't be right so I am curious how accurate this packet schema is (or if those are float values).

Regardless, one thing I find maddening about chess.com is the time architecture of the game. I haven't seen the underlying code, but it feels like the SERVER is tracking the time. This completely neglects transport time & latency meaning that 1s to move isn't really a second. Playing on the mobile client is an exercise in frustration if you are playing timed games and down to the wire. Even when you aren't, your clock will jump on normal moves and it is most obvious during the opening.

This could also be due to general poor network code as well. The number of errors I get during puzzles is also frustrating. Do they really not retry a send automatically?? <breath>

Chess.com has the brand and the names... but dang, the tech feels SO rough to me.

  • bluecalm 6 hours ago

    Chess.com software might be the worst public facing software ever assembled. During their most popular weekly tournament (by the number of spectators) called Titled Tuesday where significant % of the world elite regularly competes they send links on a public chat to a 3rd site every 4 rounds. The reason is that there is a few minutes break and they failed implementing a clock on their side so they need 3rd party service for that.

    This is one of the many, many things but imo it's the most telling. They can't even add a clock counting down the 6 minutes to their web client.

  • pshc 15 hours ago

    > it feels like the SERVER is tracking the time

    TBH this is what I expected for all online chess. How else to reconcile the two players' differing clocks and also prevent client-side cheating?

    • MobileVet 12 hours ago

      I guess my naive frustration comes from crazy fps games tracking things so precisely and yet somehow Chess.com can’t handle a turn based game?! Honestly.

      I do recognize that fps games utilize predictive algorithms and planning to estimate future player positions but still, turn based networking with 100ms accuracy should be a solved problem

      • pshc 9 hours ago

        Yeah honestly I agree like it would be nice if they switched to WebRTC or UDP.

        • palata 4 hours ago

          So you need to send a few bytes of information every few seconds, but you want to spam the network with UDP packets containing those few bytes?

          • sokoloff 2 hours ago

            Sure; why not? If I can stream videos on that same network for entertainment, or play another online, multiplayer game, why not use UDP if it gives a better user experience? It's not like UDP transport of those bytes is significantly worse network-wise and certainly lighter weight than those other alternatives.

          • lomase 3 hours ago

            Every single online multiplayer game that cares about latency reimplements a subset of HTTP over UDP.

            • WJW an hour ago

              Huh, that's not what I would expect at all. If you are having custom network protocols anyway, why deal with all the overhead that even a subset of HTTP brings? You might as well make an entirely new protocol at that point.

    • nightowl_games 10 hours ago

      Netcode dev here. Predicting the clock is a trivially solved problem. The client and server know the latency between each other, the server can offset the timestamp on the input from the client to compensate for this difference, and the client can offset it's rendering of the clock data from the server. The same techniques used in regular online gaming would apply here. The only X factor here is the impact of the client lieing about its latency to the server, perhaps that could have an impact, not sure.

      • crashbunny 9 hours ago

        > The only X factor here is the impact of the client lieing about its latency to the server, perhaps that could have an impact, not sure.

        on lichess it does have an impact. lichess has a thing they call lag compensation where the server can add time to a player's clock after the server receives their move.

        The goal is to make it fair for someone with high lag playing someone with low lag.

        I don't know the exact cheating method used. I'll have a guess, though. What if someone spent a few seconds looking at the board before making their move, and then adding (edit: oops, subtracting) a few seconds to their clock in their response packet. The server would see the client made their move instantly based on the time in the response packet, but it took a few seconds for the server to receive the packet. i.e. lag. So it might add time to compensate for the perceived lag.

        Lag compensation cheating is a frequent topic on the lichess forums.

    • palata 4 hours ago

      > How else to reconcile the two players' differing clocks and also prevent client-side cheating?

      Is there a point in preventing cheating, really? I can just make a bot...

    • MichaelZuo 14 hours ago

      It hasn’t been done client side in any pvp game I’ve heard of.

      • stevage 13 hours ago

        I'm pretty sure freechess.org did.

        • MichaelZuo 12 hours ago

          How is it being done client side?

          • compiler-guy 6 hours ago

            Freechess shipped a binary called “timeseal” that did the calculations for you and encrypted the communications. It was not foolproof—-not by a long shot, but it also didn’t completely suck.

            You can read about what became timeseal here. https://eprint.iacr.org/2004/203.pdf

          • stevage 11 hours ago

            Well it's a long time since I played there. But it had custom chess clients, which I assume just recorded how much time your move actually took and sent that with the move.

            Yes, it's easy to cheat with this, but it's very easy to cheat with chess anyway.

    • bongodongobob 14 hours ago

      Track the two clients pings? What client side cheating prevention would you need to do in chess? Afaik you can't cheat by clipping through walls or jumping around on the map.

      • connicpu 14 hours ago

        The client side cheating would by lying about when you received the packet in order to give yourself more time to think. Even if you only shifted it by 200ms per move, that could add up to a lot over the course of a long game.

        • kaoD 13 hours ago

          To give additional context: bullet chess can go down to 1 minute per player. Lying about a few millisecond per move there is huge.

      • HDThoreaun 14 hours ago

        Cheat by giving yourself more time

  • pengowray 14 hours ago

    > they show the time in seconds which can't be right

    Seems right.

    If you export/download games from lichess, they use the .pgn (Portable Game Notation) format, which is a standard plain-text format circa 1993, used by pretty much everyone for describing a chess game.

    Lichess follows the specification to the letter, and as it only technically allows one-second accuracy, lichess only record moves with one-second accuracy. It seems insane, but that's how they do it.

    Chess.com also exports PGN files, but they add a decimal place, allowing subsecond accuracy. No one has a problem with this. There is no software which cannot handle this. But Lichess refuses to "break" the spec.

    lichess PGN export example:

    > 1. d3 { [%eval -0.15] [%clk 0:01:00] } 1... g6 { [%eval 0.04] [%clk 0:01:00] }

    Chess.com PGN export example:

    > 1. d4 {[%clk 0:02:58.6]} 1... b6 {[%clk 0:02:59.2]}

    • kibwen 12 hours ago

      > lichess only record moves with one-second accuracy

      According to this blog post, this doesn't appear to be the case since at least 2017:

      https://lichess.org/@/lichess/blog/a-better-game-clock-histo...

      "Move times are now stored and displayed with a precision of one tenth of a second. The precision even goes up to one hundredth of a second, for positions where the player had less than 10 seconds left on their clock."

      • pengowray 11 hours ago

        Interesting. Thanks for the correction and link. I'll note though the .pgn downloads still only show 1 second precision, as do the game PGNs in lichess's "open database" archive.

  • Scene_Cast2 11 hours ago

    What I'd love is for my pre-moves to be sent to the server immediately so I don't time out when I pre-moved.

    • KolmogorovComp 38 minutes ago

      That would introduce other issues I think. Since premove are cancellable/changeable, what happen if you changed at the very last moment but due to delay it did not reached the server in time?

    • fbernier 10 hours ago

      What's interesting about this is chess.com allows you to stack as many pre-moves as you like but they each cost 0.1s, whereas on lichess you can only have one pre-move which is technically free but maybe not because of delay.

    • y-curious 9 hours ago

      The worst part is they call it an intentional choice. "First off, premoves take 0.1 seconds. That is what has been preferred and agreed upon by most professional players we have consulted on the topic. They prefer .1 to .0 for premove. This is also what other chess servers do."[1]

      It's super annoying and the reason I only play blitz+ on chesscom.

      [1]https://www.chess.com/forum/view/help-support/mate-in-one-qu...

  • mkagenius 15 hours ago

    Vladimir Kramnik agrees with your observations about chesscom.

    • tkahlrt 13 hours ago

      Yes, he had timing problems in an online tournament on chess.com (against a Mexican GM in the same room) where his computer did not have all Windows updates and/or the timezone was wrong.

      chess.com confirmed the issue.

    • chongli 15 hours ago

      I'm surprised to see anyone bring him up here!

      • sourcepluck 10 hours ago

        You're surprised that Kramnik is mentioned when the discussion topic is related to chess? I don't understand why. He's well-known in chess (and in chess memeland).

        • chongli 6 hours ago

          Kramnik is a former world champion who has taken a torch to his own reputation by accusing tons of people of cheating without evidence. He’s been banned as a regular columnist on chess.com after using his column as a platform to attack people. He has next to no credibility on any chess issues these days.

          • rjatran 15 minutes ago

            A ban just means that a group of bureaucrats decided to take public action against a specific person and not against others.

            Carlsen, Nakamura and chess.com itself have participated in the Niemann witch hunt. No evidence of over-the-board cheating has ever been provided.

            None of the accusers is banned.

            Kramnik did the same as they did (by indeed going too far).

    • nih 14 hours ago

      Interesting

  • bongodongobob 14 hours ago

    I can't play bullet on chess.com for this reason. Lost way too many games on "time" even though I had a second or two on the clock. Incredibly frustrating.

galkk 16 hours ago

So essentially lichess chose StackOverflow approach - (rather) beefy servers, instead of "treating them like a cattle".

Interesting that they accumulate and periodically store game state. Unfortunately it is not very clear, where they store ongoing game state - in redis or on server itself. Also cost breakdown doesn't have server for redis, only for DB.

BTW, their github has better architectural picture, than overly simplified one in the article: https://raw.githubusercontent.com/lichess-org/lila/master/pu.... Unfortunately, I'm afraid, drawing something like that during interview may not land a job at faang =(

Note that they have cost per game fairly low: $0.00027, 3,671 games per dollar.

Their cost breakdown, for ones who are curious https://docs.google.com/spreadsheets/d/1Si3PMUJGR9KrpE5lngSk...

p.s. I'm not saying that Lichess's approach is the best or faang is the worst. Remember, lichess had 10 hours outage exactly because of the architecture chosen (single datacenter dependency). https://lichess.org/@/Lichess/blog/post-mortem-of-our-longes... . And outages like that are exactly the reasons why multi-datacenter and multi-region architectures are drilled down into faang engineers.

My point is is that there are cases when this approach is legit, but typical interview is laser focused on different things, and most probably won't appreciate the "old style" approach to the problem. I'm sure that if Thibault will ever decide to land in faang he will neither do whiteboard coding nor system design.

  • winrid 5 hours ago

    The downtime here is mostly OVH's fault. They're not known for fast support on hardware failures, that's why they're cheap. If they had this architecture on AWS EC2 and could just spin up a new AMI, then they'd only have a few minutes downtime, and the same simple architecture.

  • juujian 14 hours ago

    I remember Meta having a few outages of their own. And outlook as well. So I'm not sure what to think now. But sure, on paper FAANG is redundant and hence better.

    • xmprt 7 hours ago

      In my experience, issues scale exponentially with scale. So handling 10x the traffic might mean 100x the potentially issues. Redundancy helps with that so when something inevitably fails, the architecture is able to automatically recover and the end user doesn't see any degradation. So what works for lichess wouldn't work for Meta.

  • benediktwerner 14 hours ago

    Redid runs on the main server, where lila runs, as indicated in the diagram you linked. And moves are buffered in lila. Redis is only used for pub-sub.

  • jeanlucas 9 hours ago

    roughtly 3600 games per dollar? I have over 30k games... Time to pay up

  • epolanski 15 hours ago

    > Unfortunately, I'm afraid, drawing something like that during interview may not land a job at faang =(

    Yet another reason to be skeptical of the quality of hiring in faang if anything.

    • immibis 15 hours ago

      Why feel anything about it at all? You work at FAANG: be glad for the money or quit if there isn't any. You don't work at FAANG: bad hiring makes it easier for you to get hired and make money.

      • epolanski 15 hours ago

        You haven't considered the third option: couldn't care less about working at these companies because of different reasons (personal, financial, geography, cv or whatever).

        My criticism was mostly towards the very poor metrics these companies have introduced behind hiring, albeit I can understand that given the gigantic amount of applications they get a mechanism for removing false positives is acceptable even if missing on false negatives.

        And even more that it spread to companies that do not have their problems and can't afford false negatives.

      • simplify 14 hours ago

        This is a limited, self-centered way of thinking (not self-ish, just self in the neutral sense of the word).

        Looking at second-order effects, many companies look up to FAANG for "best practices", which often includes them blindly copying their hiring practices. Without feeling or calling out any healthy skepticism, the software hiring world becomes a worse place overall.

perihelions 18 hours ago

- "While these moves could be calculated client-side, providing them server-side ensures consistency - especially for complex or esoteric chess variants - and optimizes performance on clients with limited processing capabilities or energy restrictions."

Just a wild guess: might be intended to lower the implementation barrier for new open-source software clients on new platforms, and/or preempt them from implementing subtle logic bugs that only show up much later.

The rules of chess are a bit tedious to implement, and you can easily get tired and code an edge-case bug that's almost invisible. Lichess itself did this—it once had a logic error that affected a very tiny number (exactly 7) of games,

https://github.com/lichess-org/database/issues/23 ("Before 2015: Some games with illegal moves were recorded")

(I apologize I couldn't find the specific patch that fixed this)

  • xmprt 17 hours ago

    For those curious about the illegal move, it seems like it's allowing queen side castling through the king side rook (or vice versa). eg. if this is the first rank, R _ _ R K _ _ _, then you could make the move O-O-O and end up with _ _ _ R K _ _ _

    Naturally, it's not possible to view this move anymore, but this game (https://lichess.org/XDQeUk6j#48) has everything up until the last legal move right before the illegal castling happened.

    • ARandumGuy 16 hours ago

      I can see why that only appeared in 7 games. It's pretty rare to see a rook in between a king and another rook that are otherwise legally able to castle. Even rarer for someone to get into that position and actually try to castle.

      Also that linked game is pretty entertaining. It's not a good game, but it can be fun watching lower ranked players make moves that you'd never see in higher level games. Like, who plays Bb5+ against the Scandinavian? Amazing stuff.

    • complexworld 14 hours ago

      Wouldn't the bug with queen side castling end up with _ _ K R _ _ _ _?

    • adamisom 15 hours ago

      Wow it just ate the rook huh?

  • ARandumGuy 16 hours ago

    Another wild guess: Lichess could be pre-calculating and caching the legal moves for the most common chess positions. While pre-calculating every possible legal move for every position would be impossible, you could pre-calculate the most common openings and endgames, which could cover a lot of real-world positions. This cache could easily be larger then practical for the client, but a server could hold onto it no problem. This could save on the net processing time, compared to the client determining all legal moves for every position.

  • benediktwerner 14 hours ago

    From what I remember, one of the main reason also was to avoid bloating the JS on the game page. That page is kept especially slim to maximize performance and load times for low-powered devices.

    • ngcc_hk 4 hours ago

      Great!

      A bit of surprise consideration … is that even common in these days of overfancy web sites.

  • epcoa 18 hours ago

    > and/or preempt them from implementing subtle logic bugs that only show up much later.

    Validating a submitted move is distinct from listing valid moves. I assumed the server would need to validate regardless of providing a list to the client.

    • perihelions 18 hours ago

      It's still duplicated work, and clients are likely to get it wrong and create more work for both devs.

hyperhopper 18 hours ago

I wish the article explained how it dealt with message loss from the at-most-once redis pub/sub channel

  • MathMonkeyMan 7 hours ago

    I have no idea, but the in-house pub/sub tech at a previous job used [PGM][1] together with some hand-written brokers and a client library. The overall delivery guarantee is at-most-once, but in over ten years and across tens of thousands of machines in multiple datacenters, they never saw a single dropped message. Not sure how they measured that, but I was told the measurements were accurate.

    Well, except for that one major outage where everything shit the bed due to some misconfiguration of IP multicast in the datacenters, or so I was told.

    So, maybe if your mission isn't life critical, you can just wrongfully assume exactly-once delivery.

    [1]: https://en.wikipedia.org/wiki/Pragmatic_General_Multicast

  • benatkin 17 hours ago

    Indeed, it does deal with the message loss. I was momentarily confused because in my many thousands of bullet chess games on Lichess I haven't had much of any message loss that can be attributed to Lichess's servers (but plenty when my Internet connection is down or unstable).

    I will have to take a look, because whatever it's doing, it works very well!

    • crabmusket an hour ago

      The at-most-once delivery could be an issue if lichess's backend services (lila or lila-ws) crash. Presumably this a rare enough occurrence that message loss is more of a theoretical concern.

  • DylanSp 15 hours ago

    I was hoping for that too, that's the kind of interesting architectural question I wanted this article to answer.

d4rti 17 hours ago

I suspect the “l” parameter is for observed latency as the client displays observed latency from the server.

  • lxgr 16 hours ago

    Lichess also compensates for latency to some extent.

    To do that, the server needs some measure of “how long does the client think the player actually took to make a move”, to later subtract latency not attributable to actual thinking from the clock.

evrydayhustling 10 hours ago

It seems shocking to me that the server enumerates and transmits all legal next-moves. I get that there could be chess variants with server side information, but the article also says it might be good for constrained clients. Is it really cheaper to read moves off a serialized interface than to compute them client side??

burgerquizz 13 hours ago

how would you protect your websocket server? I am building a game, but when I put the domain behind (free plan) cloudflare, I get latency delay (3x slower) on the players events.

Saw CF had some paying solution, but was wondering about a free solution

  • NathanFlurry 12 hours ago

    I've been managing game servers that get attacked on a daily basis for almost a decade. I've tried Cloudflare a few times (on their business plan) and seen poor results every time.

    Cloudflare has a lower latency product called Argo Smart Routing [1]. When we tried Argo in 2020, we still saw 10+ ms increased latency across the board, which is unacceptable for competitive multiplayer games. That said, Discord voice still (or used to) uses Argo for voice, so there are certainly less latency-sensitive games where it would work well.

    The other issue with sockets over Cloudflare (circa 2020 on business plan) is they get terminate liberally with the assumption you have a reconnection mechanism in place. I'd imagine this is acceptable for traditional WebSocket use cases, but not for games.

    Services like OVH & Vultr also advertise "DDoS protection for games," but I've found these to be pretty useless in practice. We can only measure traffic that reaches our game servers, so I have no way of knowing if they're actually helping at all.

    Your best bet is getting familiar with iptables and fine-tuning rules to match your game's traffic patterns. Thankfully, LLMs are pretty good at generating these rules for you nowadays if you're not already familiar with these tools. Make sure to set up something like node-exporter to be able to monitor attacks and understand where things go wrong. There have been a few other posts on HN in the past that go into more depth about game server DoS mitigation [2] [3].

    I built something in the same vein for my startup (Apache 2.0 OSS, steal our code!) [4] that runs a series of load balancers in front of game servers in order to act like a mini-Cloudflare. In addition to the basics I already listed, we also have logic under the hood that (a) dynamically routes traffic to load balancers and (b) autoscales hardware based on traffic in order to absorb attacks. We're rolling out a dynamic bot attack & mitigation mechanism soon to handle more complex patterns.

    [1] https://www.cloudflare.com/application-services/products/arg...

    [2] https://news.ycombinator.com/item?id=35771466

    [3] https://news.ycombinator.com/item?id=28675094

    [4] https://github.com/rivet-gg/rivet

zxilly 17 hours ago

I wonder why this protocol needs an ack? a websocket wrapped in a tls should be perfectly capable of guaranteeing the integrity of the message

  • parl_match 16 hours ago

    That just means that the message hit the TLS terminator. It doesn't mean that the backend logic received the state change.

  • andai 17 hours ago

    You can verify this with ten lines of code and clumsy (a tool for simulating packet loss).

    I tried this and not all the messages I sent arrived.

    • enneff 16 hours ago

      What do you mean? If you open a web socket connection it should behave like a normal TCP connection. All sent data guaranteed to be delivered complete and in order, unless the connection fails.

      • andai 22 minutes ago

        I think I had it set up to auto reconnect. So I suppose the packets sent between "failure occurs" and "socket disconnected" were lost.

        At any rate my conclusion was disappointment that if I actually want reliability, I need to implement my own ACKs anyway, meaning I'm paying a pretty high overhead for no benefit.

        At least now there's UDP in browser with WebTransport. I haven't tried it yet, but I hear it's a lot more pleasant than the previous option WebRTC, which was so convoluted (for the "I just want a UDP socket" usecase) that very few people used it.

      • mananaysiempre 16 hours ago

        Unless the connection fails, at which point you have no idea when it failed. You know that the other side received all stream offsets within [initial, X] with X ≥ last received ACK, but other than that you have no idea what X is. Even getting the last received ACK value out of whatever API or upper-level protocol you’re using could be nontrivial, because people rarely bother.

  • enneff 16 hours ago

    So that the client knows the message has been delivered and handled by the server, which can make the UI indicate the state of the connection.

  • augusto-moura 16 hours ago

    Maybe authorization, illegal moves? Don't know the full protocol to know how they handle edge cases. They might just return a NACK

bobmcnamara 16 hours ago

nit: fen only encodes board state, not game state

Edit: also includes move count but not repetition.

  • xrisk 15 hours ago

    How is the game state not just the board state? Move history doesn’t matter in chess (FEN encodes the 50 move rule)

jackcviers3 13 hours ago

And scalachess is written in scala, to piggyback off a post earlier this month that claimed the language is dead. The project is very successful and has been around and maintained for years.

  • valenterry 11 hours ago

    If all the Rust people knew how nice Scala 3 as a language is... they would be surprised.

    What still isn't great is the ecosystem and the build-tooling compared to Rust (part of it because of the JVM). But just language-wise, it basically has all the goodies of Rust and much more. Ofc. it's easier for Scala to have that because it does not have to balance against zero-overhead abstraction like Rust does.

    Still, Scala was hyped at some point (and I find it wasn't justified). But now, the language is actually one if not the best of very-high-level-languages that is used in production and not just academic. It's kind of sad to see, that it does not receive more traction, but it does not have the marketing budget of, say, golang.

shironandon 17 hours ago

what happens to those websocket connections when the API is updated or redeployed?

  • paxys 16 hours ago

    It's pretty easy to build auto reconnect capability in the client. The server will drop all its connections and go out of rotation, and the client will start a new connection and find the new one. If the switch happens fast enough then the user shouldn't even notice.

  • zazaulola 17 hours ago

    It is to be expected that LLM will make a decision on its own if it suspects any changes to the API. In any case, there is no time to fix the code during the game.

    • VoidWhisperer 17 hours ago

      They werent talking about an LLM here

immibis 15 hours ago

As I understand, the separation between Lila and Lila-ws is primarily for fault isolation rather than independent scaling. Maybe independent scaling becomes useful if websocket overhead exceeds what one machine can handle.

sam0x17 17 hours ago

20 years later I still think "female lich" whenever I see the word lichess, even though I know it's li chess.

  • krisoft 3 hours ago

    One day I, if I find the time for the pun, i really want to sculpt a chess set where the black pieces are all undead necromancer wizards and the white pieces are all asian fruits with rough-skin. That way we can have a game of lychees vs liches on lichess.

  • Suppafly 17 hours ago

    makes me think of the Asian fruit.

  • AlienRobot 16 hours ago

    When you promote a pawn to queen that's actually the lichess.

  • Keyframe 17 hours ago

    there are more of us then!

blastro 16 hours ago

lichess is one of the best sites on the internet. very happy to contribute my $5/mo

  • hilux 15 hours ago

    Hello, fellow Patron!

    Even though nowadays I hardly have time to play, I'm still happy to support such a delightfully honorable and usable(!) open-source project.

    • dankwizard 13 hours ago

      People love mentioning that they donate to LiChess.

      It's a weird trend. Altruism truly does not exist

      (I donated btw) (Probably more than you) (But who's counting)

      • hilux 12 hours ago

        You must be fun at parties.

  • trod123 16 hours ago

    If you consider this to be true, you would seem to have a rather low standard.

    There are many aspects in which they are not the best.

    • dibyadarshan 16 hours ago

      Like?

      Ad-free, compute intensive, non-CRUD, massively scaled, complex cheat moderation, infinite puzzles/analysis, educational (studies/tactics/openings explorer), etc. All this for free. I'm curious what's the best website in your opinion

      • trod123 5 hours ago

        I could elaborate, but rather, let me ask you this instead since its more relevant.

        What is the point of responding with any legitimate criticism when any potentially negative sentiment however mild, upfront, expressing disagreement, gets downvoted to the point where the mechanics of the website squelches the person and silences them (by purposeful intent).

        Can you ever have any legitimate intelligent conversation after a participant has been harmed and effectively silenced in this way?

        When you cannot speak freely, there can be no intelligent communications raising the bar objectively. The opposite occurs, and anything provided, even seemingly rational conversation falls after such a threat or action of violence, all conversation then falls into the gutter as a result of the added coercive cost imposed. You may contend that its not violence, but it meets the WHO definition for such which properly accounts for psychological torture and coercion (of which this is a common form).

        It should go without saying, but you cannot have any intelligent conversation when those who embrace totalitarian methods prevent you from speaking (and yes these meet the criteria).

        At the point this happens, regardless of valid criticism, or pointing out errors in methodology, it all dies on the vine, the communication is clear; you will be punished for disagreeing. That destructive behavior inevitably leads to ruin.

        This is fairly basic stuff, in order to think and be intelligent, one must be able to risk being offensive. In order to learn something new, one must risk being offended.

        When neither are possible because you or someone else muzzles any conversation expressing disagreement or corrosively add cost, even under such modest terms as here, the fallout is silent, yet devastating.

        It might not seem like much, but the light goes out of the world as those with intelligence withdraw their support, and the natural consequences which were held at bay by these people, albeit slow moving, become inevitable.

        Best of luck to you. There is only the possibility of harm by continuing any discussion under these circumstances.

        I'd suggest remembering this when you start wondering, "where have all the intelligent and competent people gone?".

        Silence doesn't indicate agreement. It is indicative of the best and brightest no longer contributing to the same systems that seek to destroy or enslave them.

        • palata 4 hours ago

          It seems like your negative sentiment above has been downvoted a lot, and I understand your frustration. Your comment was indeed not offensive.

          But I believe it was just that: a negative sentiment. Not exactly a "constructive, intelligent criticism". And when you go there, the reality is that people will vote to reflect their own opinion. If you say "This project is so amazing!" and get a ton of upvotes, it does not mean that your comment is super useful; just that many people agree. Similarly, if you say "Naah, it sucks" and get a ton of downvotes, it means that many people disagree. Not that they want to silent you.

          Now try an actual constructive criticism: you may get downvotes (that's how it is because people are emotional beings), but probably upvotes as well if you bring interesting insights.

          > There is only the possibility of harm by continuing any discussion under these circumstances.

          That's fair. I think one mistake there is that you should have started with a constructive criticism rather than an admittedly polite "naaaah, I think it sucks".

ilrwbwrkhv 18 hours ago

Beautiful architecture. Startups and companies like Netflix should learn from this instead of cargo culting microservices.

  • enneff 16 hours ago

    And what exactly do you think lila, lila-ws, and redis are if not microservices (or as they should be called, “services”)? Lichess could easily be implemented as a single monolithic process but it is not.

  • ajkjk 17 hours ago

    What? Do you have some reason to think Netflix's architecture is deficient?

    • paxys 17 hours ago

      Because the top 5 comments on HN always say so, so it must be true.

    • ilrwbwrkhv 17 hours ago

      Overly complicated with microservices. Can be made 10x simpler.

      • LinuxAmbulance 17 hours ago

        Sometimes simplicity is not the best goal.

        Redundancy, scalability, decoupling, resilience, best possible handling of errors, cost optimization, etc. may be more important at the scale Netflix operates at.

        • lcnPylGDnU4H9OF 16 hours ago

          > Redundancy, scalability, decoupling, resilience, best possible handling of errors, cost optimization, etc. may be more important at the scale Netflix operates at.

          So much that they built a tool to intentionally make things difficult (read: it arbitrarily stops production system processes/containers/etc.) and help inform what decisions to make in favor of fault tolerance.

          > Exposing engineers to failures more frequently incentivizes them to build resilient services.

          https://github.com/Netflix/chaosmonkey

          https://en.wikipedia.org/wiki/Chaos_engineering

          • renewiltord 15 hours ago

            Embarrassing. I built 99% of Netflix functionality locally with VLC and a subdirectory of mkv files.

            • trashburger 13 hours ago

              Good for you. Now please aim 10,000 requests a second at your file server.

              • renewiltord 12 hours ago

                Because I don't use microservices, I don't need 10,000 requests a second to play a video file.

                • achierius 9 hours ago

                  I think the point was 10,000 files on 10,000 different hosts, per second.

                  • renewiltord 7 hours ago

                    Well, if they’re only watching one second of video that’s easy. The files could be super small too.

                    Okay, I can’t keep this up. I was parodying the position not being serious.

        • ilrwbwrkhv 15 hours ago

          For Netflix level of complexity. Pornhub has more traffic and serves more customer than Netflix with monolithic PHP and some services.

      • ajkjk 11 hours ago

        You know something about their internal architecture and why it was built that way and the tradeoffs involved, I guess?

huins 15 hours ago

> - l: Probably some length?

I don't understand why the author didn't just look this up in the source code. Lichess is open source and we can see exactly what this field is here, it's the average lag:

https://github.com/lichess-org/lila/blob/45b5f0cfbbf6c045ad7...

  send = (t: string, d: any, o: any = {}, noRetry = false): void => {
    const msg: Partial<MsgOut> = { t };
    if (d !== undefined) {
      if (o.withLag) d.l = Math.round(this.averageLag);
      if (o.millis >= 0) d.s = Math.round(o.millis * 0.1).toString(36);
      msg.d = d;
    }
    if (o.ackable) {
      msg.d = msg.d || {}; // can't ack message without data
      this.ackable.register(t, msg.d); // adds d.a, the ack ID we expect to get back
    }

    const message = JSON.stringify(msg);
    ...
Which is calculated from how long the server takes to respond to ping messages that the client sends:

  private schedulePing = (delay: number): void => {
    clearTimeout(this.pingSchedule);
    this.pingSchedule = setTimeout(this.pingNow, delay);
  };

  private pingNow = (): void => {
    clearTimeout(this.pingSchedule);
    clearTimeout(this.connectSchedule);
    const pingData =
      this.options.isAuth && this.pongCount % 10 == 2
        ? JSON.stringify({
            t: 'p',
            l: Math.round(0.1 * this.averageLag),
          })
        : 'null';
    try {
      this.ws!.send(pingData);
      this.lastPingTime = performance.now();
    } catch (e) {
      this.debug(e, true);
    }
    this.scheduleConnect();
  };

  private computePingDelay = (): number => this.options.pingDelay + (this.options.idle ? 1000 : 0);

  private pong = (): void => {
    clearTimeout(this.connectSchedule);
    this.schedulePing(this.computePingDelay());
    const currentLag = Math.min(performance.now() - this.lastPingTime, 10000);
    this.pongCount++;

    // Average first 4 pings, then switch to decaying average.
    const mix = this.pongCount > 4 ? 0.1 : 1 / this.pongCount;
    this.averageLag += mix * (currentLag - this.averageLag);

    pubsub.emit('socket.lag', this.averageLag);
    this.updateStats(currentLag);
  };
  • stevage 13 hours ago

    To be fair, the author already put tons of work into this post. Don't begrudge them for not doing even more.