{"id":481,"date":"2025-09-17T06:49:03","date_gmt":"2025-09-17T06:49:03","guid":{"rendered":"https:\/\/ruby-doc.org\/blog\/?p=481"},"modified":"2025-09-22T13:56:20","modified_gmt":"2025-09-22T13:56:20","slug":"ruby-meets-high-frequency-data-handling-real-time-streams","status":"publish","type":"post","link":"https:\/\/ruby-doc.org\/blog\/ruby-meets-high-frequency-data-handling-real-time-streams\/","title":{"rendered":"Ruby Meets High-Frequency Data: Handling Real-Time Streams"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"770\" height=\"472\" src=\"https:\/\/ruby-doc.org\/blog\/wp-content\/uploads\/2025\/09\/ruby-meets.png\" alt=\"\" class=\"wp-image-502\" srcset=\"https:\/\/ruby-doc.org\/blog\/wp-content\/uploads\/2025\/09\/ruby-meets.png 770w, https:\/\/ruby-doc.org\/blog\/wp-content\/uploads\/2025\/09\/ruby-meets-300x184.png 300w, https:\/\/ruby-doc.org\/blog\/wp-content\/uploads\/2025\/09\/ruby-meets-768x471.png 768w\" sizes=\"(max-width: 770px) 100vw, 770px\" \/><\/figure>\n\n\n\n<p>Modern applications increasingly rely on real-time data \u2014 Market tickers, sensor feeds, or live game updates \u2014 where thousands of messages can arrive each second. Ruby is often thought of as a language for web apps or scripts, not firehose streaming. But with the right concurrency model, flow control, and careful resource management, Ruby can process high-frequency streaming APIs reliably.<\/p>\n\n\n\n<p>This article examines how Ruby handles such workloads: what tools to use, how to avoid memory or latency issues, and where Ruby shines vs where lower-level languages may be necessary. For developers building trading platforms or crypto exchanges, it\u2019s worth looking at ecosystems like <a href=\"https:\/\/www.bydfi.com\/en\">https:\/\/www.bydfi.com\/en<\/a>, which demonstrate how high-throughput real-time systems can power live financial data, user dashboards, and transaction flows at scale.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Concurrency Models in Ruby<\/h2>\n\n\n\n<p>Ruby provides several models for handling concurrency and I\/O; choosing wisely is key for high-frequency streaming.<\/p>\n\n\n\n<p>Recommendation: For pure network-bound streams (e.g., WebSocket message ingestion), fiber-based async I\/O typically gives the best trade-off of readability, performance, and resource usage.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Handling Backpressure and High Message Throughput<\/h2>\n\n\n\n<p>High message rates (e.g., hundreds to thousands per second) can kill naive consumers. Consider:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Buffering \/ Queues: Use tools like Async::Queue to decouple ingestion from processing.<\/li>\n\n\n\n<li>Early filtering\/batching: Discard irrelevant messages or accumulate them into batches for downstream tasks.<\/li>\n\n\n\n<li>Offload heavy work: DB writes, large JSON parsing, analytics\u2014push these into background jobs. Avoid doing them in-line in the read loop.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Flow control and throttling: If the downstream becomes a bottleneck, you may need to pause reading or apply backpressure explicitly.<br><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Example: Consuming BYDFi Public Market Stream<\/h2>\n\n\n\n<p>Below is a streamlined example using async-websocket. It shows how to subscribe to a stream, buffer incoming messages, filter, and process asynchronously.<\/p>\n\n\n\n<p>Notes \/ Improvements for Production:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Add reconnect logic <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/WebSockets_API\">if the WebSocket connection<\/a> drops.<\/li>\n\n\n\n<li>Monitor latency and queue length to avoid growing delays.<\/li>\n\n\n\n<li>Use structured logging, not per-message console output.<\/li>\n\n\n\n<li><a href=\"https:\/\/www.w3schools.com\/whatis\/whatis_json.asp\">If JSON parsing becomes<\/a> costly, consider using faster JSON libraries or partial parsing.<br><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Memory, Stability, and Long-Lived Streams<\/h2>\n\n\n\n<p>For consumers running continuously (days\/weeks):<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Heap \/ GC monitoring: Use GC.stat, memory profiling to detect leaks.<\/li>\n\n\n\n<li>Object reuse: Reuse buffers, avoid unnecessary object allocations (strings, arrays).<\/li>\n\n\n\n<li>Error resilience: Reconnect strategies, catching exceptions, and timeout handling.<\/li>\n\n\n\n<li>Logging: Structured, batched; avoid per-message logging in production (IO can block).<\/li>\n<\/ul>\n\n\n\n<p><strong>Performance Checklist<\/strong><\/p>\n\n\n\n<p>Before deploying a streaming consumer, verify:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Which concurrency model are you using; is it async\/fiber-based or thread-based?<\/li>\n\n\n\n<li>That buffer\/queue doesn\u2019t grow unbounded under load.<\/li>\n\n\n\n<li>There are no blocking calls (DB, disk) in the main ingestion loop.<\/li>\n\n\n\n<li>Profiling &amp; monitoring in place: throughput, latency, memory.<\/li>\n\n\n\n<li>Testing with a real or representative feed (e.g., BYDFi) under load.<br><\/li>\n<\/ol>\n\n\n\n<p>While crypto feeds are a typical example, these strategies apply broadly:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>IoT \/ sensor networks (temperature, motion, health).<\/li>\n\n\n\n<li>Multiplayer games (state sync, updates).<\/li>\n\n\n\n<li>Social media fire-hose \/ real-time analytics.<\/li>\n\n\n\n<li>Forex, equities, or any financial market data.<\/li>\n<\/ul>\n\n\n\n<p>The core challenges \u2014 concurrency + flow control + memory stability \u2014 are common across domains.<br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Ruby isn\u2019t usually the first language people think of for ultra-low latency or super high frequency streaming, but it need not be dismissed. With tools like async-websocket and the fiber-based scheduler in Ruby 3+, together with good design (buffering, filtering, offloading work, monitoring), Ruby <em>can<\/em> provide a stable, maintainable solution for many real-world streaming use cases.<\/p>\n\n\n\n<p>If your application needs microsecond latency or extremely tight control over every nanosecond (e.g., high frequency trading), then lower-level languages (C++, <a href=\"https:\/\/ruby-doc.org\/blog\/best-rust-development-teams-for-high-performance-software\/\">Rust<\/a>, Go) may be more appropriate. But for prototyping, dashboards, alerts, bots \u2014 Ruby gives you developer speed plus enough technical muscle to hold up under serious throughput.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Modern applications increasingly rely on real-time data \u2014 Market tickers, sensor feeds, or live game updates \u2014 where thousands of messages can arrive each second. Ruby is often thought of as a language for web apps or scripts, not firehose streaming. But with the right concurrency model, flow control, and careful resource management, Ruby can [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":502,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-481","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ruby-tips"],"blocksy_meta":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Ruby Meets High-Frequency Data: Handling Real-Time Streams - Ruby-Doc.org<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ruby-doc.org\/blog\/ruby-meets-high-frequency-data-handling-real-time-streams\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ruby Meets High-Frequency Data: Handling Real-Time Streams - Ruby-Doc.org\" \/>\n<meta property=\"og:description\" content=\"Modern applications increasingly rely on real-time data \u2014 Market tickers, sensor feeds, or live game updates \u2014 where thousands of messages can arrive each second. Ruby is often thought of as a language for web apps or scripts, not firehose streaming. But with the right concurrency model, flow control, and careful resource management, Ruby can [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ruby-doc.org\/blog\/ruby-meets-high-frequency-data-handling-real-time-streams\/\" \/>\n<meta property=\"og:site_name\" content=\"Ruby-Doc.org\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-17T06:49:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-22T13:56:20+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ruby-doc.org\/blog\/wp-content\/uploads\/2025\/09\/ruby-meets.png\" \/>\n\t<meta property=\"og:image:width\" content=\"770\" \/>\n\t<meta property=\"og:image:height\" content=\"472\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Ryan McGregor\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ryan McGregor\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/ruby-meets-high-frequency-data-handling-real-time-streams\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/ruby-meets-high-frequency-data-handling-real-time-streams\\\/\"},\"author\":{\"name\":\"Ryan McGregor\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/#\\\/schema\\\/person\\\/db7fcc3c518c40f29f8bf79ffa678dfc\"},\"headline\":\"Ruby Meets High-Frequency Data: Handling Real-Time Streams\",\"datePublished\":\"2025-09-17T06:49:03+00:00\",\"dateModified\":\"2025-09-22T13:56:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/ruby-meets-high-frequency-data-handling-real-time-streams\\\/\"},\"wordCount\":602,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/ruby-meets-high-frequency-data-handling-real-time-streams\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/ruby-meets.png\",\"articleSection\":[\"Ruby tips\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/ruby-meets-high-frequency-data-handling-real-time-streams\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/ruby-meets-high-frequency-data-handling-real-time-streams\\\/\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/ruby-meets-high-frequency-data-handling-real-time-streams\\\/\",\"name\":\"Ruby Meets High-Frequency Data: Handling Real-Time Streams - Ruby-Doc.org\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/ruby-meets-high-frequency-data-handling-real-time-streams\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/ruby-meets-high-frequency-data-handling-real-time-streams\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/ruby-meets.png\",\"datePublished\":\"2025-09-17T06:49:03+00:00\",\"dateModified\":\"2025-09-22T13:56:20+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/ruby-meets-high-frequency-data-handling-real-time-streams\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/ruby-meets-high-frequency-data-handling-real-time-streams\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/ruby-meets-high-frequency-data-handling-real-time-streams\\\/#primaryimage\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/ruby-meets.png\",\"contentUrl\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/ruby-meets.png\",\"width\":770,\"height\":472},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/ruby-meets-high-frequency-data-handling-real-time-streams\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ruby Meets High-Frequency Data: Handling Real-Time Streams\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/\",\"name\":\"Ruby-Doc.org\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/#organization\",\"name\":\"Ruby-Doc.org\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Ruby-Doc.org_logo_cropped.png\",\"contentUrl\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Ruby-Doc.org_logo_cropped.png\",\"width\":909,\"height\":833,\"caption\":\"Ruby-Doc.org\"},\"image\":{\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/#\\\/schema\\\/person\\\/db7fcc3c518c40f29f8bf79ffa678dfc\",\"name\":\"Ryan McGregor\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f7b4d11da7f55d40163cd9431935ce1148d9bd69c95928064822f7757b6314dd?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f7b4d11da7f55d40163cd9431935ce1148d9bd69c95928064822f7757b6314dd?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f7b4d11da7f55d40163cd9431935ce1148d9bd69c95928064822f7757b6314dd?s=96&d=mm&r=g\",\"caption\":\"Ryan McGregor\"},\"url\":\"https:\\\/\\\/ruby-doc.org\\\/blog\\\/author\\\/ryan\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Ruby Meets High-Frequency Data: Handling Real-Time Streams - Ruby-Doc.org","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ruby-doc.org\/blog\/ruby-meets-high-frequency-data-handling-real-time-streams\/","og_locale":"en_US","og_type":"article","og_title":"Ruby Meets High-Frequency Data: Handling Real-Time Streams - Ruby-Doc.org","og_description":"Modern applications increasingly rely on real-time data \u2014 Market tickers, sensor feeds, or live game updates \u2014 where thousands of messages can arrive each second. Ruby is often thought of as a language for web apps or scripts, not firehose streaming. But with the right concurrency model, flow control, and careful resource management, Ruby can [&hellip;]","og_url":"https:\/\/ruby-doc.org\/blog\/ruby-meets-high-frequency-data-handling-real-time-streams\/","og_site_name":"Ruby-Doc.org","article_published_time":"2025-09-17T06:49:03+00:00","article_modified_time":"2025-09-22T13:56:20+00:00","og_image":[{"width":770,"height":472,"url":"https:\/\/ruby-doc.org\/blog\/wp-content\/uploads\/2025\/09\/ruby-meets.png","type":"image\/png"}],"author":"Ryan McGregor","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Ryan McGregor","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ruby-doc.org\/blog\/ruby-meets-high-frequency-data-handling-real-time-streams\/#article","isPartOf":{"@id":"https:\/\/ruby-doc.org\/blog\/ruby-meets-high-frequency-data-handling-real-time-streams\/"},"author":{"name":"Ryan McGregor","@id":"https:\/\/ruby-doc.org\/blog\/#\/schema\/person\/db7fcc3c518c40f29f8bf79ffa678dfc"},"headline":"Ruby Meets High-Frequency Data: Handling Real-Time Streams","datePublished":"2025-09-17T06:49:03+00:00","dateModified":"2025-09-22T13:56:20+00:00","mainEntityOfPage":{"@id":"https:\/\/ruby-doc.org\/blog\/ruby-meets-high-frequency-data-handling-real-time-streams\/"},"wordCount":602,"commentCount":0,"publisher":{"@id":"https:\/\/ruby-doc.org\/blog\/#organization"},"image":{"@id":"https:\/\/ruby-doc.org\/blog\/ruby-meets-high-frequency-data-handling-real-time-streams\/#primaryimage"},"thumbnailUrl":"https:\/\/ruby-doc.org\/blog\/wp-content\/uploads\/2025\/09\/ruby-meets.png","articleSection":["Ruby tips"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/ruby-doc.org\/blog\/ruby-meets-high-frequency-data-handling-real-time-streams\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/ruby-doc.org\/blog\/ruby-meets-high-frequency-data-handling-real-time-streams\/","url":"https:\/\/ruby-doc.org\/blog\/ruby-meets-high-frequency-data-handling-real-time-streams\/","name":"Ruby Meets High-Frequency Data: Handling Real-Time Streams - Ruby-Doc.org","isPartOf":{"@id":"https:\/\/ruby-doc.org\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ruby-doc.org\/blog\/ruby-meets-high-frequency-data-handling-real-time-streams\/#primaryimage"},"image":{"@id":"https:\/\/ruby-doc.org\/blog\/ruby-meets-high-frequency-data-handling-real-time-streams\/#primaryimage"},"thumbnailUrl":"https:\/\/ruby-doc.org\/blog\/wp-content\/uploads\/2025\/09\/ruby-meets.png","datePublished":"2025-09-17T06:49:03+00:00","dateModified":"2025-09-22T13:56:20+00:00","breadcrumb":{"@id":"https:\/\/ruby-doc.org\/blog\/ruby-meets-high-frequency-data-handling-real-time-streams\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ruby-doc.org\/blog\/ruby-meets-high-frequency-data-handling-real-time-streams\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ruby-doc.org\/blog\/ruby-meets-high-frequency-data-handling-real-time-streams\/#primaryimage","url":"https:\/\/ruby-doc.org\/blog\/wp-content\/uploads\/2025\/09\/ruby-meets.png","contentUrl":"https:\/\/ruby-doc.org\/blog\/wp-content\/uploads\/2025\/09\/ruby-meets.png","width":770,"height":472},{"@type":"BreadcrumbList","@id":"https:\/\/ruby-doc.org\/blog\/ruby-meets-high-frequency-data-handling-real-time-streams\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ruby-doc.org\/blog\/"},{"@type":"ListItem","position":2,"name":"Ruby Meets High-Frequency Data: Handling Real-Time Streams"}]},{"@type":"WebSite","@id":"https:\/\/ruby-doc.org\/blog\/#website","url":"https:\/\/ruby-doc.org\/blog\/","name":"Ruby-Doc.org","description":"","publisher":{"@id":"https:\/\/ruby-doc.org\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ruby-doc.org\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ruby-doc.org\/blog\/#organization","name":"Ruby-Doc.org","url":"https:\/\/ruby-doc.org\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ruby-doc.org\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/ruby-doc.org\/blog\/wp-content\/uploads\/2025\/07\/Ruby-Doc.org_logo_cropped.png","contentUrl":"https:\/\/ruby-doc.org\/blog\/wp-content\/uploads\/2025\/07\/Ruby-Doc.org_logo_cropped.png","width":909,"height":833,"caption":"Ruby-Doc.org"},"image":{"@id":"https:\/\/ruby-doc.org\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/ruby-doc.org\/blog\/#\/schema\/person\/db7fcc3c518c40f29f8bf79ffa678dfc","name":"Ryan McGregor","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f7b4d11da7f55d40163cd9431935ce1148d9bd69c95928064822f7757b6314dd?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f7b4d11da7f55d40163cd9431935ce1148d9bd69c95928064822f7757b6314dd?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f7b4d11da7f55d40163cd9431935ce1148d9bd69c95928064822f7757b6314dd?s=96&d=mm&r=g","caption":"Ryan McGregor"},"url":"https:\/\/ruby-doc.org\/blog\/author\/ryan\/"}]}},"_links":{"self":[{"href":"https:\/\/ruby-doc.org\/blog\/wp-json\/wp\/v2\/posts\/481","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ruby-doc.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ruby-doc.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ruby-doc.org\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/ruby-doc.org\/blog\/wp-json\/wp\/v2\/comments?post=481"}],"version-history":[{"count":7,"href":"https:\/\/ruby-doc.org\/blog\/wp-json\/wp\/v2\/posts\/481\/revisions"}],"predecessor-version":[{"id":504,"href":"https:\/\/ruby-doc.org\/blog\/wp-json\/wp\/v2\/posts\/481\/revisions\/504"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ruby-doc.org\/blog\/wp-json\/wp\/v2\/media\/502"}],"wp:attachment":[{"href":"https:\/\/ruby-doc.org\/blog\/wp-json\/wp\/v2\/media?parent=481"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ruby-doc.org\/blog\/wp-json\/wp\/v2\/categories?post=481"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ruby-doc.org\/blog\/wp-json\/wp\/v2\/tags?post=481"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}