[{"data":1,"prerenderedAt":243},["ShallowReactive",2],{"project-17176965":3},{"id":4,"name":5,"line":6,"line_source":7,"title":8,"url":9,"domain":10,"maker":11,"posted_at":12,"year":13,"points":14,"comments":15,"rank_in_year":16,"shown_in_year":17,"top":18,"tier":19,"category":20,"subcategory":21,"format":22,"keywords":23,"reception":29,"sentiment":30,"stance_mix":31,"scored_comments":35,"aspects":36,"strip":42,"post_text":43,"what":44,"said":66,"maker_in_thread":145,"shape":147,"grid":152,"attempts":204,"same_week":205,"maker_shows":41,"maker_hidden":235,"reader_version":236,"card":237},"17176965","Golimit","Ringpop-based distributed and decentralized rate limiter","title","Show HN: Golimit – Ringpop-based distributed and decentralized rate limiter","https:\u002F\u002Fgithub.com\u002Fmyntra\u002Fgolimit","github.com","realrocker",1527576235,2018,53,24,763,2155,36,"notable","infrastructure","rate limiting","other",[24,25,26,27,28],"rate limiter","distributed rate limiting","ringpop","sidecar","go","curious",-0.143,{"positive":32,"neutral":33,"mixed":32,"critical":34},0,13,3,16,{"idea":37,"execution":38,"design":40},{"positive":32,"critical":32},{"positive":32,"critical":39},1,{"positive":32,"critical":41},2,[34,32,34,34,34,34,39,34,39,34,34,39,34,34,32,32,32,32,34,34,32,32,34,32],null,{"problem":43,"audience":43,"pricing":43,"motivation":43,"time_to_build":43,"stack":45,"openness":64,"stage":65,"team_size":65},[46,56],{"value":47,"source":48,"evidence":49},"Go","inferred",[50,52],{"id":51},"post",{"id":53,"by":54,"text":55},"17179092","aaron42net","Skimming the bucket code, it appears that the rate-limiting information is stored in a map. It doesn't appear to implement an LRU or attempt to clean up stale entries. If I feed…",{"value":57,"source":58,"evidence":59},"Ringpop clustering","commenter",[60],{"id":61,"by":62,"text":63},"17180129","yogeshpandey","Sadly ringpop is no more active. But in golimit we are using just clustering constructs of ringpop, which seems to be quite stable in latest version. We are using distributed…","open_source","unknown",{"praise":67,"objections":79,"requests":103,"questions":113,"alternatives":130},[68],{"value":69,"source":58,"evidence":70},"Looks useful and interesting project",[71,75],{"id":72,"by":73,"text":74},"17177705","freeman478","Thanks, looks quite useful. However it seems based on https:\u002F\u002Fgithub.com\u002Fuber\u002Fringpop-go which is marked as no longer active... What are you using to implement rate limiting ?",{"id":76,"by":77,"text":78},"17181502","chatmasta","If the deployment is using docker (i.e. haproxy in one container, the sidecar in another), “local” TCP can be a big bottleneck. I was using TCP for redis over a local docker…",[80,88,95],{"value":81,"source":58,"evidence":82},"Relies on Ringpop, which is no longer maintained",[83,84],{"id":72,"by":73,"text":74},{"id":85,"by":86,"text":87},"17181535","jerf","If the underlying project is unsupported, and you're only using a part of it, and the licenses permit, I'd suggest just pulling the relevant code into your own. That eliminates…",{"value":89,"source":58,"evidence":90},"Local HTTP sidecar interface adds overhead; Unix sockets preferred",[91,94],{"id":92,"by":77,"text":93},"17180290","Why does this implement an HTTP interface on the sidecar? Isn’t that a lot of unnecessary overhead for incrementing a counter? The connection will always be on a local interface,…",{"id":76,"by":77,"text":78},{"value":96,"source":58,"evidence":97},"In-memory counters are lost on failure and map may grow without bound",[98,102],{"id":99,"by":100,"text":101},"17184852","ashish6111988","The project looks cool. Just want to understand how counter syncing works here, have you implemented CRDTs? Since, everything is in RAM, if service goes down, all counters' data…",{"id":53,"by":54,"text":55},[104,109],{"value":105,"source":58,"evidence":106},"Support Unix domain sockets instead of HTTP",[107,108],{"id":92,"by":77,"text":93},{"id":76,"by":77,"text":78},{"value":110,"source":58,"evidence":111},"Add durability for counters",[112],{"id":99,"by":100,"text":101},[114,121],{"value":115,"source":58,"evidence":116},"How is counter syncing implemented (CRDTs)?",[117,118],{"id":99,"by":100,"text":101},{"id":119,"by":62,"text":120},"17187320","Thanks, The counters are synced in CRDT way , every node has both local and global counters and local counter are synced asynchronously with global counter periodically or on…",{"value":122,"source":58,"evidence":123},"Can it integrate with HAProxy as a sidecar?",[124,127],{"id":125,"by":77,"text":126},"17178095","If I’m reading this right, is it possible to use the sidecar technique to install this along keep my existing load balancer architecture? For example, if every server has an…",{"id":128,"by":62,"text":129},"17179883","you can write LUA code in Haproxy to call golimit on http endpoint. and react based on response",[131,138],{"value":132,"source":58,"evidence":133},"ratelimitj (Java)",[134],{"id":135,"by":136,"text":137},"17177895","crbaker","Totally biased opinion, but I think you should check out https:\u002F\u002Fgithub.com\u002Fmokies\u002Fratelimitj if you are Java based.",{"value":139,"source":58,"evidence":140},"Prefab hosted rate limits",[141],{"id":142,"by":143,"text":144},"17178009","jdwyah","Also biased, but if you need the functionality and don’t want to run it yourself there is https:\u002F\u002Fwww.prefab.cloud\u002Fdocumentation\u002Fbasic_rate_limits",{"comments":32,"answered":32,"key":146},[],{"commenters":148,"max_depth":149,"maker_replies":32,"first_comment_mins":150,"lifespan_hours":151},12,6,176,30,[153,155,157,159,160,162,163,165,168,169,170,171,173,176,178,182,184,186,188,191,195,197,199,202],[72,32,34,154,73,32],"project\u002Fneutral\u002Fidea",[135,32,32,156,136,32],"other\u002Fneutral\u002Fnone",[61,32,34,158,62,32],"project\u002Fneutral\u002Fexecution",[85,32,34,158,86,32],[125,39,34,161,77,32],"project\u002Fneutral\u002Fdesign",[128,39,34,161,62,32],[92,39,39,164,77,32],"project\u002Fcritical\u002Fdesign",[166,39,34,167,62,32],"17181324","maker\u002Fneutral\u002Fdesign",[76,39,39,164,77,32],[99,41,34,161,100,32],[119,41,34,167,62,32],[53,34,39,172,54,32],"project\u002Fcritical\u002Fexecution",[174,34,34,158,175,32],"17179464","ttul",[177,34,34,158,62,32],"17180216",[179,34,32,180,181,32],"17180546","commenter\u002Fneutral\u002Fnone","clairity",[183,34,32,180,62,32],"17181359",[185,34,32,180,86,32],"17181576",[187,34,32,180,181,32],"17181774",[189,34,34,190,62,32],"17180040","maker\u002Fneutral\u002Fexecution",[192,193,34,154,194,32],"17180108",4,"wmf",[196,193,32,180,62,32],"17180225",[198,193,32,156,194,32],"17181596",[200,193,34,154,201,32],"17180682","zzzcpan",[142,203,32,156,143,32],5,[],[206,211,216,221,226,231],{"id":207,"name":208,"points":209,"category":210},"17146451","Wired-elements",650,"dev_tools",{"id":212,"name":213,"points":214,"category":215},"17173051","Crypto51",581,"finance_crypto",{"id":217,"name":218,"points":219,"category":220},"17147272","Parabola.io",291,"web_saas",{"id":222,"name":223,"points":224,"category":225},"17189652","Writing Streak",262,"productivity",{"id":227,"name":228,"points":229,"category":230},"17180686","Recursive Recipes",250,"consumer_social",{"id":232,"name":233,"points":234,"category":225},"17149371","Clippi.io",208,false,"v2",{"id":238,"name":5,"line":6,"ai":235,"cat":20,"year":13,"points":14,"comments":15,"rec":29,"s":239,"top":18,"kw":240,"maker":11,"domain":10,"tier":19,"attempts":32,"strip":241,"url":9,"mix":242,"praise":69,"objection":81,"sub":21},17176965,-0.14,[24,25,26,27,28],"303333131331330000330030",[32,33,32,34],1794036566401]