[{"data":1,"prerenderedAt":464},["ShallowReactive",2],{"nav-stories":3,"footer-stories":61,"project-metric-stream":74},[4,16,25,34,43,52],{"id":5,"color":6,"extension":7,"image":8,"label":9,"link":10,"meta":11,"order":12,"stem":13,"text":14,"__hash__":15},"stories\u002Fstories\u002F01-data-center.yml",null,"yml","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1558494949-ef010cbdcc31?w=1080","DATA_CENTER","https:\u002F\u002Fx.com\u002Fabbeytetteh_",{},1,"stories\u002F01-data-center","Racking new servers. 40gbit backbone online.","0QUZQbaANhdO8WemZxkDdO7vbVopfnynHtH9FxBZb_w",{"id":17,"color":6,"extension":7,"image":18,"label":19,"link":6,"meta":20,"order":21,"stem":22,"text":23,"__hash__":24},"stories\u002Fstories\u002F02-thoughts.yml","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1498050108023-c5249f4df085?w=1080","THOUGHTS",{},2,"stories\u002F02-thoughts","Late night bug hunting. Found the memory leak.","Gd1am954aasY6HRHD7hCtOuessXb6zYZ8iizS501ICg",{"id":26,"color":27,"extension":7,"image":6,"label":28,"link":6,"meta":29,"order":30,"stem":31,"text":32,"__hash__":33},"stories\u002Fstories\u002F03-coding.yml","#3b82f6","CODING",{},3,"stories\u002F03-coding","Just thinking about how much easier life is with Swarm.","vLAyiGUPtlXB2SHa5KM_U2AaK4QkG3Og85UEUE7qzgM",{"id":35,"color":6,"extension":7,"image":36,"label":37,"link":6,"meta":38,"order":39,"stem":40,"text":41,"__hash__":42},"stories\u002Fstories\u002F04-update.yml","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1591799264318-7e6ef8ddb7ea?w=1080","UPDATE",{},4,"stories\u002F04-update","New cluster nodes arrived. Prepping for installation.","kyT60N5C6Re_jMonZbgNy0PbQhzXmUWxDbD0D_v43ts",{"id":44,"color":45,"extension":7,"image":6,"label":46,"link":6,"meta":47,"order":48,"stem":49,"text":50,"__hash__":51},"stories\u002Fstories\u002F05-setup.yml","#86868b","SETUP",{},5,"stories\u002F05-setup","Optimizing the telemetry pipeline for 1M req\u002Fs.","cPOBkzoyXsCmPgRO2d80Hj3vm4MP-6nAejtlQ5iuSzw",{"id":53,"color":6,"extension":7,"image":54,"label":55,"link":6,"meta":56,"order":57,"stem":58,"text":59,"__hash__":60},"stories\u002Fstories\u002F06-travel.yml","https:\u002F\u002Fimages.unsplash.com\u002Fphoto-1560969184-10fe8719e047?w=1080","TRAVEL",{},6,"stories\u002F06-travel","Travel log — system architecture workshop in Berlin.","jnOxerdF6usAIHdR35Z-opx0LJAy9kZluXnZhtz62Z0",[62,64,66,68,70,72],{"id":5,"color":6,"extension":7,"image":8,"label":9,"link":10,"meta":63,"order":12,"stem":13,"text":14,"__hash__":15},{},{"id":17,"color":6,"extension":7,"image":18,"label":19,"link":6,"meta":65,"order":21,"stem":22,"text":23,"__hash__":24},{},{"id":26,"color":27,"extension":7,"image":6,"label":28,"link":6,"meta":67,"order":30,"stem":31,"text":32,"__hash__":33},{},{"id":35,"color":6,"extension":7,"image":36,"label":37,"link":6,"meta":69,"order":39,"stem":40,"text":41,"__hash__":42},{},{"id":44,"color":45,"extension":7,"image":6,"label":46,"link":6,"meta":71,"order":48,"stem":49,"text":50,"__hash__":51},{},{"id":53,"color":6,"extension":7,"image":54,"label":55,"link":6,"meta":73,"order":57,"stem":58,"text":59,"__hash__":60},{},{"id":75,"title":76,"body":77,"description":452,"extension":453,"hash":454,"liveUrl":6,"meta":455,"navigation":456,"order":294,"path":457,"rackBay":6,"rackStatus":6,"region":458,"seo":459,"stem":460,"thumbnail":461,"vault":462,"__hash__":463},"projects\u002Fprojects\u002Fmetric-stream.md","Metric Stream",{"type":78,"value":79,"toc":447},"minimark",[80,84,89,101,429,433,436,440,443],[81,82,83],"p",{},"Metric Stream is a purpose-built telemetry ingestion pipeline designed for environments where sensor data arrives faster than a traditional time-series database can absorb it.",[85,86,88],"h2",{"id":87},"architecture","Architecture",[81,90,91,92,96,97,100],{},"Producers write events to Redis Streams using ",[93,94,95],"code",{},"XADD",". A pool of Go consumer goroutines reads with ",[93,98,99],{},"XREADGROUP",", processes and enriches the events (unit conversion, anomaly flagging, threshold evaluation), and forwards the result to the downstream store.",[102,103,108],"pre",{"className":104,"code":105,"language":106,"meta":107,"style":107},"language-go shiki shiki-themes vitesse-light","func (w *Worker) Run(ctx context.Context) error {\n    for {\n        entries, err := w.redis.XReadGroup(ctx, &redis.XReadGroupArgs{\n            Group:    w.group,\n            Consumer: w.id,\n            Streams:  []string{w.stream, \">\"},\n            Count:    100,\n            Block:    time.Second,\n        })\n        if err != nil { continue }\n        for _, e := range entries[0].Messages {\n            w.process(ctx, e)\n        }\n    }\n}\n","go","",[93,109,110,164,171,217,236,252,292,306,324,330,353,389,411,417,423],{"__ignoreMap":107},[111,112,114,118,122,126,130,134,137,141,144,147,150,153,156,158,161],"span",{"class":113,"line":12},"line",[111,115,117],{"class":116},"sbBg2","func",[111,119,121],{"class":120},"sYZai"," (",[111,123,125],{"class":124},"svycV","w ",[111,127,129],{"class":128},"si04Y","*",[111,131,133],{"class":132},"sUxyF","Worker",[111,135,136],{"class":120},")",[111,138,140],{"class":139},"sySUi"," Run",[111,142,143],{"class":120},"(",[111,145,146],{"class":124},"ctx",[111,148,149],{"class":132}," context",[111,151,152],{"class":120},".",[111,154,155],{"class":132},"Context",[111,157,136],{"class":120},[111,159,160],{"class":128}," error",[111,162,163],{"class":120}," {\n",[111,165,166,169],{"class":113,"line":21},[111,167,168],{"class":116},"    for",[111,170,163],{"class":120},[111,172,173,176,179,182,185,188,190,193,195,198,200,202,204,207,209,211,214],{"class":113,"line":30},[111,174,175],{"class":124},"        entries",[111,177,178],{"class":120},",",[111,180,181],{"class":124}," err",[111,183,184],{"class":120}," :=",[111,186,187],{"class":124}," w",[111,189,152],{"class":120},[111,191,192],{"class":124},"redis",[111,194,152],{"class":120},[111,196,197],{"class":139},"XReadGroup",[111,199,143],{"class":120},[111,201,146],{"class":124},[111,203,178],{"class":120},[111,205,206],{"class":128}," &",[111,208,192],{"class":132},[111,210,152],{"class":120},[111,212,213],{"class":132},"XReadGroupArgs",[111,215,216],{"class":120},"{\n",[111,218,219,222,225,228,230,233],{"class":113,"line":39},[111,220,221],{"class":124},"            Group",[111,223,224],{"class":120},":",[111,226,227],{"class":124},"    w",[111,229,152],{"class":120},[111,231,232],{"class":124},"group",[111,234,235],{"class":120},",\n",[111,237,238,241,243,245,247,250],{"class":113,"line":48},[111,239,240],{"class":124},"            Consumer",[111,242,224],{"class":120},[111,244,187],{"class":124},[111,246,152],{"class":120},[111,248,249],{"class":124},"id",[111,251,235],{"class":120},[111,253,254,257,259,262,265,268,271,273,276,278,282,286,289],{"class":113,"line":57},[111,255,256],{"class":124},"            Streams",[111,258,224],{"class":120},[111,260,261],{"class":120},"  []",[111,263,264],{"class":128},"string",[111,266,267],{"class":120},"{",[111,269,270],{"class":124},"w",[111,272,152],{"class":120},[111,274,275],{"class":124},"stream",[111,277,178],{"class":120},[111,279,281],{"class":280},"sSP4y"," \"",[111,283,285],{"class":284},"spphp",">",[111,287,288],{"class":280},"\"",[111,290,291],{"class":120},"},\n",[111,293,295,298,300,304],{"class":113,"line":294},7,[111,296,297],{"class":124},"            Count",[111,299,224],{"class":120},[111,301,303],{"class":302},"s-TwI","    100",[111,305,235],{"class":120},[111,307,309,312,314,317,319,322],{"class":113,"line":308},8,[111,310,311],{"class":124},"            Block",[111,313,224],{"class":120},[111,315,316],{"class":124},"    time",[111,318,152],{"class":120},[111,320,321],{"class":124},"Second",[111,323,235],{"class":120},[111,325,327],{"class":113,"line":326},9,[111,328,329],{"class":120},"        })\n",[111,331,333,336,338,341,344,347,350],{"class":113,"line":332},10,[111,334,335],{"class":116},"        if",[111,337,181],{"class":124},[111,339,340],{"class":128}," !=",[111,342,343],{"class":128}," nil",[111,345,346],{"class":120}," {",[111,348,349],{"class":116}," continue",[111,351,352],{"class":120}," }\n",[111,354,356,359,362,364,367,369,372,375,378,381,384,387],{"class":113,"line":355},11,[111,357,358],{"class":116},"        for",[111,360,361],{"class":124}," _",[111,363,178],{"class":120},[111,365,366],{"class":124}," e",[111,368,184],{"class":120},[111,370,371],{"class":116}," range",[111,373,374],{"class":124}," entries",[111,376,377],{"class":120},"[",[111,379,380],{"class":302},"0",[111,382,383],{"class":120},"].",[111,385,386],{"class":124},"Messages",[111,388,163],{"class":120},[111,390,392,395,397,400,402,404,406,408],{"class":113,"line":391},12,[111,393,394],{"class":124},"            w",[111,396,152],{"class":120},[111,398,399],{"class":139},"process",[111,401,143],{"class":120},[111,403,146],{"class":124},[111,405,178],{"class":120},[111,407,366],{"class":124},[111,409,410],{"class":120},")\n",[111,412,414],{"class":113,"line":413},13,[111,415,416],{"class":120},"        }\n",[111,418,420],{"class":113,"line":419},14,[111,421,422],{"class":120},"    }\n",[111,424,426],{"class":113,"line":425},15,[111,427,428],{"class":120},"}\n",[85,430,432],{"id":431},"throughput","Throughput",[81,434,435],{},"In benchmarks on 4 consumer instances, the pipeline sustains 52k events\u002Fsecond with P99 end-to-end latency of 18ms. The Redis consumer group ensures exactly-once delivery semantics even if a worker crashes mid-batch.",[85,437,439],{"id":438},"status","Status",[81,441,442],{},"Deployed in a staging environment with production rollout planned for Q3 2026. Pending load testing at 100k events\u002Fsecond target.",[444,445,446],"style",{},"html pre.shiki code .sbBg2, html code.shiki .sbBg2{--shiki-default:#1E754F}html pre.shiki code .sYZai, html code.shiki .sYZai{--shiki-default:#999999}html pre.shiki code .svycV, html code.shiki .svycV{--shiki-default:#B07D48}html pre.shiki code .si04Y, html code.shiki .si04Y{--shiki-default:#AB5959}html pre.shiki code .sUxyF, html code.shiki .sUxyF{--shiki-default:#2E8F82}html pre.shiki code .sySUi, html code.shiki .sySUi{--shiki-default:#59873A}html pre.shiki code .sSP4y, html code.shiki .sSP4y{--shiki-default:#B5695977}html pre.shiki code .spphp, html code.shiki .spphp{--shiki-default:#B56959}html pre.shiki code .s-TwI, html code.shiki .s-TwI{--shiki-default:#2F798A}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":107,"searchDepth":21,"depth":21,"links":448},[449,450,451],{"id":87,"depth":21,"text":88},{"id":431,"depth":21,"text":432},{"id":438,"depth":21,"text":439},"Real-time telemetry pipeline for high-throughput sensor data using Go and Redis Streams, processing over 50k events per second.","md","S9T0U1",{},true,"\u002Fprojects\u002Fmetric-stream","EU-WEST-1",{"title":76,"description":452},"projects\u002Fmetric-stream","\u002Fimages\u002Fthumbnails\u002Fmetric-stream.png",false,"MugEKAYZVkkgQBZB14V9locuNfQvVoHgaGIWQRVeyFw",1779361989368]