
<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Асинхронный транспорт Cassandra @ HighLoad++ 2022</title>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <meta name="description" content="Асинхронный транспорт Cassandra @ HighLoad++ 2022"/>
    <!-- Google -->
    <meta name="google-site-verification" content="Cty2j5b8d9ZVAqLCyQzYnfzMuF-1dBwaNvZ5wIp3Q4s" />
    <!-- Yandex -->
    <meta name='yandex-verification' content='493d381cbb23fd86' />
    <!-- Bootstrap -->
    <link href="https://yastatic.net/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" media="screen"/>
    <!-- Highlight.js -->
    <link rel="stylesheet" href="https://yastatic.net/highlightjs/8.2/styles/default.min.css">
    <link rel="stylesheet" href="https://yastatic.net/highlightjs/8.2/languages/scala.min.js">
    <!-- Atom feed -->
    <link rel="alternate" type="application/atom+xml" href="/feed.atom" title="incubos.org"/>
  </head>
  <body>
    <nav class="navbar navbar-default">
      <div class="container-fluid">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="/">incubos.org</a>
        </div>
        <div id="navbar" class="collapse navbar-collapse">
          <ul class="nav navbar-nav">
            <li ><a href="/"><i class="glyphicon glyphicon-book"></i> Blog</a></li>
            <li ><a href="/biography/"><i class="glyphicon glyphicon-user"></i> Biography</a></li>
            <li ><a href="/contacts/"><i class="glyphicon glyphicon-envelope"></i> Contacts</a></li>
          </ul>
        </div>
      </div>
    </nav>

    <div class="container">
      
<div class="page-header">
    <h1><a href="/posts/2022/11/24/highload-async-transport/">Асинхронный транспорт Cassandra @ HighLoad++ 2022</a> <small>2022-11-24</small></h1>
</div>

<p>Выступил с докладом <a href="https://highload.ru/moscow/2022/abstracts/9791">"Асинхронный транспорт Cassandra" на HighLoad++ 2022</a>.</p>
<p>Cassandra является основным хранилищем (мета)данных в Одноклассниках. У нас развёрнуты сотни высоконагруженных кластеров из сотен узлов и тысяч клиентов, распределённых по нескольким дата-центрам. Мы используем и активно развиваем собственный форк Cassandra 2.x. Помимо фиксов множества багов и многочисленных оптимизаций, мы реализовали глобальные индексы (которые работают), поддержали партиционированные транзакции (NewSQL), полностью автоматизировали эксплуатацию в production и многое другое. Но в этом докладе мы сконцентрируемся на подходе FatClient, который используется в наших системах повсеместно.</p>
<p>Подход FatClient переносит роль координатора запросов на клиента, который становится полноценным участником кластера Cassandra. Это позволяет устранить лишние сетевые задержки, разгрузить ноды Cassandra от сетевых задач координации и значительно повысить производительность и стабильность поведения всей системы. Но несмотря на все достоинства подхода, мы столкнулись с неэффективностью и ограничениями существующего транспорта Cassandra на масштабах кластеров, состоящих из тысяч участников: узлов, хранящих данные, и клиентов, работающих с этими данными.</p>
<p>В докладе мы подробно рассмотрим собственную реализацию асинхронного транспорта Cassandra, которая позволила нам существенно сэкономить ресурсы и упростить жизнь разработчиков. Новый транспорт основан исключительно на Java SDK и лаконичной, но эффективной реализации Actor Model. Помимо устройства нашего решения, поговорим про различные оптимизации, возникшие по пути проблемы, а также переключение на асинхронный транспорт нагруженных кластеров Cassandra в production.</p>
<p><a href="/2022/highload/async-cassandra-transport.pdf">Download slides</a>.</p>
<div class="embed-responsive embed-responsive-16by9">
  <iframe class="embed-responsive-item" src="//www.youtube-nocookie.com/embed/TmX8pbM1rUI" allow="autoplay; encrypted-media"></iframe>
</div>

<div class="ya-share2" data-curtain data-size="l" data-shape="round" data-lang="en" data-services="vkontakte,facebook,odnoklassniki,telegram,twitter"></div>

<div id="disqus_thread"></div>
<script type="text/javascript">
  /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
  var disqus_shortname = 'incubosorg'; // required: replace example with your forum shortname

  /* * * DON'T EDIT BELOW THIS LINE * * */
  (function() {
  var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
  dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
  (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
  })();
</script>
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
<a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
    </div>

    <div class="container"><small>Copyright © 2013-2023 Vadim Tsesko (Вадим Цесько)</small></div>

    <!-- Bootstrap -->
    <script src="https://yastatic.net/jquery/1.12.3/jquery.min.js"></script>
    <script src="https://yastatic.net/bootstrap/3.3.6/js/bootstrap.min.js"></script>

    <!-- Highlight.js -->
    <script src="https://yastatic.net/highlightjs/8.2/highlight.min.js"></script>
    <script type="text/javascript">
      hljs.initHighlightingOnLoad();
    </script>

    <!-- Sharing -->
    <script src="https://yastatic.net/share2/share.js"></script>

    <!-- Yandex.Metrika counter -->
    <script type="text/javascript">(function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter21056926 = new Ya.Metrika({id:21056926, webvisor:true, clickmap:true, trackLinks:true, accurateTrackBounce:true, trackHash:true}); } catch(e) { } }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = (d.location.protocol == "https:" ? "https:" : "http:") + "//mc.yandex.ru/metrika/watch.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); } })(document, window, "yandex_metrika_callbacks");</script><noscript><div><img src="//mc.yandex.ru/watch/21056926" style="position:absolute; left:-9999px;" alt="" /></div></noscript><!-- /Yandex.Metrika counter -->
  </body>
</html>