{"id":287133,"date":"2017-05-31T14:50:03","date_gmt":"2017-05-31T10:50:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=287133"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=287133","title":{"rendered":"\u0420\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0442\u0440\u0438\u043c\u0430 \u043b\u043e\u0433\u043e\u0432 \u0441 RxJava \u2014 \u0427\u0430\u0441\u0442\u044c 1"},"content":{"rendered":"<p><strong><em><a href=\"https:\/\/balamaci.ro\/reactive-log-processing\/\">Reactive log stream processing with RxJava \u2014 Part l<\/a><\/em><\/strong><\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u043e\u0441\u0442\u0435 \u0430\u0432\u0442\u043e\u0440 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b \u0441\u043b\u0443\u0447\u0430\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <a href=\"http:\/\/www.elasticsearch.org\/\">ELK<\/a> \u0441\u0442\u0435\u043a\u0430 \u0438 \u0441\u0431\u043e\u0440\u0430 \u043b\u043e\u0433\u043e\u0432.<br \/>  \u0421 \u0443\u0447\u0435\u0442\u043e\u043c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043b\u043e\u0433\u043e\u0432 \u0438 \u0438\u0445 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u0435-\u0444\u0430\u043a\u0442\u043e <strong>\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c<\/strong>. <\/p>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0440\u044f\u0434\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0437\u0430\u0434\u043e\u043b\u0433\u043e \u0434\u043e \u0438\u0445 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f.*<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p><em>\u0421\u043d\u043e\u0441\u043a\u0430 \u2014 \u0441\u0442\u0440\u0438\u043c\u044b \u0438 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438.<\/em> <em>\u0422\u0430\u043a\u0436\u0435 \u0441\u043b\u043e\u0432\u043e \u043b\u043e\u0433 \u043c\u043e\u0436\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b, \u0445\u043e\u0442\u044f \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0438\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/em><\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0431\u044b <strong>\u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438 \u043b\u043e\u0433 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043a\u0430\u043a \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/strong> \u0432 \u0432\u0430\u0448\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e <strong>\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u0430\u043d\u043d\u044b\u0435<\/strong> \u0438 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, <strong>\u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u043c\u043e\u0448\u0435\u043d\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/strong>, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f <em>&quot;\u0430\u0442\u0430\u043a\u0438&quot;<\/em>, \u0438 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b <em>&quot;\u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e&quot;<\/em> \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043b\u043e\u0433 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0438\u043d\u0446\u0438\u0434\u0435\u043d\u0442\u0430.<\/p>\n<p>  <\/p>\n<p>\u0418\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c (<strong><em>filter<\/em><\/strong>) \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0441\u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c (<strong><em>group by<\/em><\/strong>) \u0438\u0445 \u043f\u043e \u043e\u0431\u0449\u0435\u043c\u0443 \u043a\u043b\u044e\u0447\u0443 \u043a\u0430\u043a userID \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c \u043e\u043a\u043d\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0438\u043e\u0434 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<p>  <\/p>\n<pre><code> failedLogStream()      .window(5,TimeUnit.SECONDS)      .flatMap(window -&gt;                 window                 .groupBy(propertyStringValue(&quot;remoteIP&quot;))                 .flatMap(grouped -&gt; grouped                     .count()                     .map( failedLoginsCount -&gt; {                           final String remoteIp = grouped.getKey();                           return new Pair&lt;&gt;(remoteIp, failedLoginsCount);                     }))      )      .filter(pair -&gt; pair.get &gt; 10)      .forEach(System.out::println);           <\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0438\u0445 \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438 \u043a\u0430\u043a \u0441 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c <strong><em>\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0440\u0438\u043c\u0430\u043c\u0438<\/em><\/strong> (\u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u0445 <strong><em>reactive streams<\/em><\/strong> (\u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u0442\u0440\u0438\u043c\u043e\u0432).<\/p>\n<p>  <\/p>\n<h3 id=\"uchim-novuyu-paradigmu-razrabotki\">\u0423\u0447\u0438\u043c \u043d\u043e\u0432\u0443\u044e \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h3>\n<p>  <\/p>\n<p>\u0425\u043e\u0440\u043e\u0448\u043e \u0431\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 <strong><em>\u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0438\u043c\u043e\u0432<\/em><\/strong>, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435, \u0442\u0430\u043a\u043e\u0435 \u043a\u0430\u043a <a href=\"https:\/\/www.confluent.io\/blog\/introducing-kafka-streams-stream-processing-made-simple\/\">Kafka<\/a> <a href=\"https:\/\/spark.apache.org\/docs\/latest\/streaming-programming-guide.html\">Streams Spark<\/a> or <a href=\"https:\/\/flink.apache.org\/\">Flink<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e <strong>\u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435<\/strong> \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 <strong>\u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0441 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 (\u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439 \u043d\u0435 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u044b\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044f\u043c\u0438).<\/p>\n<p>  <\/p>\n<p>\u0421\u0430\u043c\u043e\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0442\u0435\u043c\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0443\u044e <strong>\u043f\u0440\u0438\u043d\u0435\u0441\u0435\u0442 Spring5<\/strong>, \u0431\u0443\u0434\u0435\u0442 <strong><a href=\"https:\/\/spring.io\/blog\/2016\/04\/19\/understanding-reactive-types\">\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0420\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a><\/strong>. \u041d\u043e\u0432\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c <strong><a href=\"https:\/\/github.com\/spring-projects\/spring-framework\/tree\/master\/spring-web-reactive\">spring-web-reactive<\/a><\/strong> \u2014 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043d\u0430 <strong>spring-web-mvc<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 (\u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435) \u043e\u0442\u0432\u0435\u0442\u044b \u0434\u043b\u044f REST \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0432\u0435\u0431-\u043a\u043b\u0438\u0435\u043d\u0442, \u0438\u0437 \u0447\u0435\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u0442\u0440\u0438\u043c\u043e\u0432 \u043d\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u0430 \u0434\u043b\u044f Spring, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0431\u0449\u0430\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f <a href=\"https:\/\/github.com\/reactive-streams\/reactive-streams-jvm\">reactive-streams-jvm<\/a>, \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e\u043c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 (\u043f\u043e\u043a\u0430 \u0434\u043b\u044f \u043d\u0435\u0435, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0438 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0430\u0442\u044c \u0437\u0430\u043c\u0435\u043d\u043e\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u043c).<\/p>\n<p>  <\/p>\n<p>\u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0434\u0435\u043b\u044c <strong><em>\u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438<\/em><\/strong> \u0431\u044b\u043b\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 Rx.NET, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Netflix \u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 java, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 RxJava. \u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0431\u044b\u043b \u0442\u0430\u043a\u0436\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u0430\u0445, \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0420\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f (<strong><a href=\"http:\/\/reactivex.io\/\">Reactive EXtensions<\/a><\/strong>). \u0421 \u0442\u0435\u0445 \u043f\u043e\u0440 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0434\u0432\u0438\u0436\u0443\u0442\u0441\u044f \u0432 \u0442\u043e\u043c \u0436\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438, \u0447\u0442\u043e \u0438 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0441\u0442\u0440\u0438\u043c\u043e\u0432. \u0421\u0435\u0439\u0447\u0430\u0441 <strong>RxJava<\/strong>, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d \u0431\u044b\u043b \u043f\u0435\u0440\u0432\u043e\u043f\u0440\u043e\u0445\u043e\u0434\u0446\u0435\u043c, \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c <em>\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0435<\/em>(\u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043a\u043e\u0434\u0430) \u2014 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0435\u0440\u0441\u0438\u044f 2.\u0445 \u043b\u0443\u0447\u0448\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438, \u0438, \u043f\u043e\u043a\u0430 Spring reactor \u0435\u0449\u0435 \u043d\u043e\u0432\u0438\u0447\u043e\u043a, \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u0440\u0443\u0434\u0430 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u043e\u043d\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0441\u0432\u044f\u0437\u0430\u043d\u044b.<\/p>\n<p>  <\/p>\n<p>Doug Lea \u0441\u043e\u043e\u0431\u0449\u0438\u043b, \u0447\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 java.util.concurrent.Flow, \u0430 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0442\u0440\u0438\u043c\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 <strong>Java 9<\/strong>.<\/p>\n<p>  <\/p>\n<h3 id=\"preimuschestva-s-tochki-zreniya-proizvoditelnosti\">\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/h3>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0434\u0440\u0443\u0433\u0438\u043c \u043c\u043e\u0434\u043d\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c \u0441\u0435\u0439\u0447\u0430\u0441 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0441 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0412 \u0438\u0434\u0435\u0430\u043b\u0435, \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u044f \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u041f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435, \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0436\u0434\u0430\u0442\u044c \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0433\u0434\u0430 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u0432\u0435\u0440\u043d\u0435\u0442 \u0432\u0430\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"http:\/\/blog.isatimur.xyz\/content\/images\/2017\/04\/image-1.png\" alt=\"Never block\"\/><\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u043a\u0430\u043a Stream (\u0421\u0442\u0440\u0438\u043c-\u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445), \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 action (\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435) \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043e\u0442\u0432\u0435\u0442\u0430, \u0442\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u0442\u043e\u043a\u0430, \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u0432\u043e\u0439 \u043e\u0442\u0432\u0435\u0442, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0432 \u0446\u0435\u043b\u043e\u043c, \u0447\u0442\u043e, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442 \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0442\u0435\u043a\u0430 \u043f\u043e\u0442\u043e\u043a\u043e\u0432).<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u043d\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043b\u043e\u0433\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0447\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u043e. <\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440: \u0441\u0435\u0440\u0432\u0438\u0441\u0443, \u0442\u0430\u043a\u043e\u043c\u0443 \u043a\u0430\u043a Gmail, \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (emails). \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, emails, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043b\u044e\u0434\u0435\u0439 \u0432 \u043a\u043e\u043f\u0438\u0438 (CC). \u0411\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u044e \u0434\u043b\u044f \u0442\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0442\u0432\u043e\u0438\u0445 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0430\u0445, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0432\u044b\u0437\u043e\u0432 REST \u2014 ContactService.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code>Future&lt;List&lt;Mail&gt;&gt; emailsFuture = mailstoreService.getUnreadEmails();   List&lt;Mail&gt; emails = emailsFuture.get(); \/\/\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430   \/\/\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u043e\u043b\u0433\u043e\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \/\/\u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d?  Future&lt;List&lt;Contacts&gt;&gt; contacts = getContactsForEmails(emails);   for(Mail mail : emails) {     streamRenderEmails(mail, contacts); \/\/push(\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c) emails \u043a\u043b\u0438\u0435\u043d\u0442\u0443 }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0431\u044b\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0430 \u0441 \u043f\u0440\u0438\u0445\u043e\u0434\u043e\u043c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 Java 8 \u0441 CompletableFuture (\u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 thenCompose, thenCombine, thenAccept \u0438 \u0435\u0449\u0435 50 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438, \u0445\u043e\u0442\u044f \u044d\u0442\u043e \u043d\u0435 \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u0442\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u0430, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u043e\u043d\u0438 \u0434\u0435\u043b\u0430\u044e\u0442, \u0430 \u044d\u0442\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0432 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u0438 \u043a\u043e\u0434\u0430).<\/p>\n<p>  <\/p>\n<pre><code>CompletableFuture&lt;List&lt;Mail&gt;&gt; emailsFuture = mailstoreService.getUnreadEmails();  CompletableFuture&lt;List&lt;Contact&gt;&gt; emailsFuture     .thenCompose(emails -&gt; getContactsForEmails(emails)) \/\/\u043d\u0430\u043c \u0432\u0441\u0435 \u0435\u0449\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0436\u0438\u0434\u0430\u0442\u044c List&lt;Mail&gt;    .thenAccept(emailsContactsPair -&gt; streamRenderEmails(emailsContactsPair.getKey(), emailsContactsPair.getValue()))<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 Iterator \u0432\u043c\u0435\u0441\u0442\u043e List-\u0430, \u0438 \u0432 \u0442\u043e\u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0435-\u043b\u0438\u0431\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u0440\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u0412 SQL \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, ResultSet (\u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c rs.next()) \u0432\u043c\u0435\u0441\u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432\u0441\u0435\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c.<\/p>\n<p>  <\/p>\n<pre><code>public interface Iterator&lt;E&gt; {       \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 {@code true}, \u0435\u0441\u043b\u0438 \u0432 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.      *\/     boolean hasNext();      \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438.      *\/     E next(); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u043d\u0430\u043c \u0432\u0441\u0435 \u0435\u0449\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c &quot;\u0430 \u0443 \u0442\u0435\u0431\u044f \u0435\u0441\u0442\u044c \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435?&quot;<\/p>\n<p>  <\/p>\n<pre><code>Iterable&lt;Mail&gt; emails = mailstoreService.getUnreadEmails();   Iterator&lt;Mail&gt; emailsIt = emails.iterator();  while(emailsIt.hasNext()) {     Mail mail = emailsIt.next(); \/\/\u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0442\u0440\u0430\u0442\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439   if(mail != null) {       ....   } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0427\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u0442\u0430\u043a \u044d\u0442\u043e \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440, \u0442\u0430\u043a\u043e\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0418\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f reactive stream programming (\u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0438\u043c\u043e\u0432).<\/p>\n<p>  <\/p>\n<h3 id=\"tak-chto-zhe-takoe-stream\">\u0422\u0430\u043a \u0447\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 Stream?<\/h3>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/camo.githubusercontent.com\/e581baffb3db3e4f749350326af32de8d5ba4363\/687474703a2f2f692e696d6775722e636f6d2f4149696d5138432e6a7067\" alt=\"Everything is a stream\"\/><\/p>\n<p>  <\/p>\n<p>Stream \u043f\u043e-\u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443 \u044d\u0442\u043e <strong>\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u0445 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/strong> (\u0441\u043e\u0431\u044b\u0442\u0438\u0435X \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044fY, \u0442\u0430\u043a \u0447\u0442\u043e <strong>\u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0435 \u043a\u043e\u043d\u043a\u0443\u0440\u0438\u0440\u0443\u044e\u0442 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439<\/strong>).<\/p>\n<p>  <\/p>\n<p>Stream \u0441\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d \u0442\u0430\u043a, \u0447\u0442\u043e \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u0442 <strong>0..N<\/strong> \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438 <strong>\u043e\u0434\u043d\u0443 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439<\/strong>:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0441\u043e\u0431\u044b\u0442\u0438\u0435 <strong>\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f<\/strong>, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430\u043c \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u044b\u043f\u0443\u0441\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043a\u043e\u043d\u0447\u0435\u043d<\/li>\n<li>\u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043e\u0431 <strong>\u043e\u0448\u0438\u0431\u043a\u0435<\/strong>, \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u043e\u0431 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u0441\u0442\u0440\u0438\u043c\u0430 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 (\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c)<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e &#8216;<em>marble diagrams<\/em>&#8216;. <\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/balamaci.ro\/content\/images\/2016\/08\/RxJava1.svg\" alt=\"Marble diagram for Observable\"\/><\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c, \u0447\u0442\u043e Stream-\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u0435, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u0433 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0414\u0430\u0436\u0435 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043e \u043a\u0430\u043a \u0421\u0442\u0440\u0438\u043c, \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0438\u0439 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 <strong>\u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438.<\/strong> <\/p>\n<p>  <\/p>\n<p>\u0411\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0441\u0442\u0440\u0438\u043c \u2014 \u0441\u0442\u0440\u0438\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043d\u043e \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f(\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f | \u043e\u0448\u0438\u0431\u043a\u0438).<\/p>\n<p>  <\/p>\n<p>RxJava \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 <strong>Observable<\/strong> (\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u044b\u0439) \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Stream-\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0442\u0438\u043f\u0430 . \u0412 Spring Reactor-\u0435 \u043e\u043d \u0440\u0430\u0432\u0435\u043d \u0442\u0438\u043f\u0443 <a href=\"https:\/\/projectreactor.io\/core\/docs\/api\/reactor\/core\/publisher\/Flux.html\">Flux<\/a>.  <\/p>\n<p>Observable \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 stream \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440, \u0432\u0437\u044f\u0442\u044b\u0445 \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430\u043c\u0438.  <\/p>\n<p>Observable \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 stream \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432, \u043a\u0443\u043f\u043b\u0435\u043d\u043d\u044b\u0445 \u0432 \u043d\u0430\u0448\u0435\u043c \u0432\u0435\u0431 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435.  <\/p>\n<p>Observable \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (User), \u0432\u0435\u0440\u043d\u0443\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u043a \u0411\u0414.  <\/p>\n<pre><code>    public Observable&lt;User&gt; findByUserId(String userId) {...}     \/\/\u043f\u0443\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 Single \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438      public Single&lt;User&gt; findByUserId(String userId) {...}<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e <strong>Observable \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u043a\u0430\u043a \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Publish\/Subscriber (\u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438\/\u041f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430), \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d Subscriber(\u041f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a) \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c 3 \u0442\u0438\u043f\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439<\/strong>  <\/p>\n<pre><code>        Observable&lt;CartItem&gt; cartItemsStream = ...;          Subscriber&lt;CartItem&gt; subscriber = new Subscriber&lt;CartItem&gt;() {             @Override             public void onNext(CartItem cartItem) {                 System.out.println(&quot;Cart Item added &quot; + cartItem);             }              @Override             public void onCompleted() {             }              @Override             public void onError(Throwable e) {                 e.printStackTrace();             }         };          cartItemsStream.subscribe(subscriber);<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"reaktivnye-operatory\">\u0420\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b<\/h3>\n<p>  <\/p>\n<p>\u041d\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0430\u0441\u0442\u044c Stream-a, \u0430 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043c\u044b \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Observer (\u041d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u044c).<\/p>\n<p>  <\/p>\n<p>Reactive (\u0420\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f) \u0436\u0435 \u0447\u0430\u0441\u0442\u044c \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 Function (\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u0438), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b, \u043a\u043e\u0433\u0434\u0430 stream \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u0434\u0440\u0443\u0433\u043e\u0439 stream (\u0441\u0442\u0440\u0438\u043c\u044b <strong>immutable<\/strong>), \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0438 \u0442.\u0434.<\/p>\n<p>  <\/p>\n<pre><code>Observable&lt;CartItem&gt; filteredCartStream = cartStream.filter(new Func1&lt;CartItem, Boolean&gt;() {               @Override             public Boolean call(CartItem cartItem) {                 return cartItem.isLaptop();             }         });  Observable&lt;Long&gt; laptopCartItemsPriceStream = filteredCartStream.map(new Func1&lt;CartItem, Long&gt;() {               @Override             public Long call(CartItem cartItem) {                 try {                     return priceService.getPrice(cartItem.getId());                 } catch(PriceServiceException e) {                     thrown new RuntimeException(e);                 }             }         });<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b (\u043c\u0435\u0442\u043e\u0434\u044b) \u043a\u043b\u0430\u0441\u0441\u0430 Observable (filter, map, groupBy,&#8230;) \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 Observable, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0438\u0437 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u0445 \u0441 \u043b\u044f\u043c\u0431\u0434\u0430 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0435. <\/p>\n<p>  <\/p>\n<pre><code>Observable&lt;BigDecimal&gt; priceStream = cartStream                           .filter((cartItem) -&gt; cartItem.isLaptop()).                         .map((laptop) -&gt; {                              try {                                   return priceService.getPrice(cartItem.getId());                             } catch(PriceServiceException e) {                                  thrown new RuntimeException(e);                             }                         });<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u044b\u0448\u0435, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f <code>priceStream<\/code>, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u2014 <code>priceService.getPrice()<\/code> \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u043a\u0430 \u043d\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 rx-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u043f\u043b\u0430\u043d\u0430, \u043a\u0430\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0432\u043d\u0438\u0437 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435(\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f).<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u044f\u0442 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043e\u0431\u044b\u0447\u043d\u043e \u0432 \u0448\u0443\u0442\u043a\u0443 \u0434\u0430\u044e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 Excel \u043b\u0438\u0441\u0442\u0430\u043c\u0438, \u0433\u0434\u0435 \u0432 \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u0445 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0444\u043e\u0440\u043c\u0443\u043b\u044b, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u044f\u0447\u0435\u0439\u043a\u0438, \u0447\u0442\u043e, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0434\u0440\u0443\u0433\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0434\u0440\u0443\u0433\u0443\u044e \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u044f\u043c\u043e \u043a\u0430\u043a rx-operator, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442, \u044d\u0442\u0438 \u0444\u043e\u0440\u043c\u0443\u043b\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u043d\u0438\u0445 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u0448\u0430\u043d\u0441 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0434\u043e \u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430, \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043f\u0443\u0441\u0442\u0438\u043b\u0438\u0441\u044c \u0432\u043d\u0438\u0437 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435.<\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u043a\u0430\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0446\u0435\u043f\u043e\u0447\u043a\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u044f \u043d\u0430\u0448\u0435\u043b \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044e, \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441 \u043f\u0435\u0440\u0435\u0435\u0437\u0434\u043e\u043c \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u043e\u043c\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439, \u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0438 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0432 \u0440\u043e\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432\u0435\u0449\u0438 \u0438\u0437 \u0432\u0430\u0448\u0435\u0433\u043e \u0434\u043e\u043c\u0430 \u2014 \u0442\u0430\u043a \u044d\u0442\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0437\u0438\u043b \u0422\u043e\u043c\u0430\u0441 \u041d\u0438\u043b\u044c\u0434.<\/p>\n<p>  <\/p>\n<p>\u0415\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440 \u0441 \u043a\u043e\u0434\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code>Observable&lt;Item&gt; mover1 = Observable.create(s -&gt; {      while (house.hasItems()) {     s.onNext(house.getItem());    }    s.onCompleted(); });  Observable&lt;Item&gt; mover2 = mover1.map(item -&gt; putInBox(item));  Subscription mover3 = mover2.subscribe(box -&gt; putInTruck(box),      () -&gt; closeTruck()); \/\/\u044d\u0442\u043e \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 OnCompleted()<\/code><\/pre>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/1.bp.blogspot.com\/-1RuGVz4-U9Q\/VjT0AsfiiUI\/AAAAAAAAAKQ\/xWQaOwNtS7o\/s640\/animation_2.gif\"\/><\/p>\n<p>  <\/p>\n<p>&quot;\u0413\u0440\u0443\u0437\u0447\u0438\u043a 1 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a <code>Observable<\/code>. \u041e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0432\u044b\u0431\u0440\u043e\u0441\u044b \u0437\u0430 \u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432\u044b\u043d\u043e\u0441\u0438\u0442 \u0432\u0435\u0449\u0438 \u0438\u0437 \u0434\u043e\u043c\u0430. \u041e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0413\u0440\u0443\u0437\u0447\u0438\u043a\u0430 2 \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>onNext()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 <code>map()<\/code> \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e. \u041a\u043e\u0433\u0434\u0430 \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434 <code>onNext()<\/code> \u0432\u044b\u0437\u0432\u0430\u043d, \u043e\u043d \u0431\u0435\u0440\u0435\u0442 \u0432\u0435\u0449\u044c \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0432 \u043a\u043e\u0440\u043e\u0431\u043a\u0443. \u0417\u0430\u0442\u0435\u043c \u043e\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0413\u0440\u0443\u0437\u0447\u0438\u043a\u0430 3, \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e <code>Subscriber<\/code>(\u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430), \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>onNext()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0440\u0443\u0437\u0438\u0442 \u043a\u043e\u0440\u043e\u0431\u043a\u0443 \u0432 \u043c\u0430\u0448\u0438\u043d\u0443.&quot;<\/p>\n<p>  <\/p>\n<p>\u041c\u0430\u0433\u0438\u044f RxJava \u2014 \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u0432\u0430\u0448\u0430 \u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u0445 \u0432\u0441\u0435\u0445 \u0432\u043c\u0435\u0441\u0442\u0435 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u0447\u0435\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/github.com\/Netflix\/RxJava\/wiki\/images\/rx-operators\/Composition.1.png\"\/><\/p>\n<p>  <\/p>\n<p>\u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e Stream \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b\u0445 \u0441\u043e \u0441\u0442\u0440\u0438\u043c\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 (RxJava, RxJS, Rx.NET, etc) \u0438\u0437 \u0447\u0438\u0441\u043b\u0430 ReactiveX framework (\u0420\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439).<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u0438 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u043d\u0430\u0434\u043e \u0437\u043d\u0430\u0442\u044c \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u0438\u043c\u0430\u043c\u0438, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a Spring Reactor (\u0432 \u043d\u0430\u0434\u0435\u0436\u0434\u0435 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u0435\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u043e\u0431\u0449\u0438\u0445 \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432).<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u043c\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"http:\/\/reactivex.io\/documentation\/operators\/images\/filter.png\" alt=\"**Filter**\"\/> <\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u043f\u043e\u0434 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 (\u043e\u0434\u0438\u043d \u0433\u0440\u0443\u0437\u0447\u0438\u043a \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u0432\u0435\u0449\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u043e\u044f\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 100$, \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0432\u0441\u0435 \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0443)<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0441\u0442\u0440\u0438\u043c \u043d\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0440\u0438\u043c\u043e\u0432 \u2014 <code>Observable&lt;Observable&lt;T&gt;&gt;<\/code>(\u0421\u0442\u0440\u0438\u043c \u0441\u0442\u0440\u0438\u043c\u043e\u0432) \u2014 \u044d\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b, \u043a\u0430\u043a <code>groupBy<\/code><\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blogs.endjin.com\/wp-content\/uploads\/2014\/04\/event-stream-with-groupby1.png\" alt=\"&gt; **group by**\"\/><\/p>\n<p>  <\/p>\n<pre><code>        Observable&lt;Integer&gt; values = Observable.just(1,4,5,7,8,9,10);         Observable&lt;GroupedObservable&lt;String, Integer&gt;&gt; oddEvenStream = values.groupBy((number) -&gt; number % 2 == 0 ? &quot;odd&quot;:&quot;even&quot;);         Observable&lt;Integer&gt; remergedStream = Observable.concat(oddEvenStream);         remergedStream.subscribe(number -&gt; System.out.print(number +&quot; &quot;));<\/code><\/pre>\n<p>  <\/p>\n<pre><code>\/\/\u0412\u044b\u0432\u043e\u0434\u0438\u0442 \/\/1 5 7 9 4 8 10 <\/code><\/pre>\n<p>  <\/p>\n<p>\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>concat<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043d\u043e\u0432\u0430 \u0438\u0437 \u0447\u0435\u0442\u043d\u044b\u0445 \u0438 \u043d\u0435\u0447\u0435\u0442\u043d\u044b\u0445 \u0441\u0442\u0440\u0438\u043c\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043e\u0434\u0438\u043d-\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0442\u0440\u0438\u043c, \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043d\u0430 \u043d\u0435\u0433\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0443.<br \/>  <img decoding=\"async\" src=\"http:\/\/reactivex.io\/documentation\/operators\/images\/concat.png\" alt=\"&gt; **Concat**\"\/><\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>concat<\/code> \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0438\u043c\u0430 \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d, \u0441\u043d\u043e\u0432\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u043e\u0434\u0438\u043d \u0441\u0442\u0440\u0438\u043c. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0435\u0447\u0435\u0442\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e stream-\u043e\u0432, \u043a\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 <code>zip<\/code> \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440<br \/>  <img decoding=\"async\" src=\"https:\/\/balamaci.ro\/content\/images\/2016\/08\/zip.png\" alt=\"&gt; **Zip operator**\"\/><\/p>\n<p>  <\/p>\n<p><code>Zip<\/code> \u043d\u0430\u0437\u0432\u0430\u043d \u0442\u0430\u043a \u043d\u0435 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0430\u0440\u0445\u0438\u0432\u0430\u0442\u043e\u0440, \u043d\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u0438\u0437-\u0437\u0430 \u0442\u043e, \u0447\u0442\u043e \u043e\u043d, \u043a\u0430\u043a \u043c\u043e\u043b\u043d\u0438\u044f (\u043d\u0430 \u043a\u0443\u0440\u0442\u043a\u0435), \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0437 \u0434\u0432\u0443\u0445 stream-\u043e\u0432.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/f\/f0\/Zipper_animated.gif\" alt=\"&gt; \u041c\u043e\u043b\u043d\u0438\u044f (\u0437\u0430\u0449\u0435\u043b\u043a\u0430)\"\/><\/p>\n<p>  <\/p>\n<p>\u041e\u043d \u0431\u0435\u0440\u0435\u0442 \u043e\u0434\u043d\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e stream-\u0430 \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c \u0438\u0437 \u0434\u0440\u0443\u0433\u043e\u0433\u043e (\u0434\u0435\u043b\u0430\u044f \u043f\u0430\u0440\u0443). \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e, \u043e\u043d \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0441\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435.<\/p>\n<p>  <\/p>\n<p><em>PS:<\/em> \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 stream-\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u0447\u0442\u043e, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u0434\u0438\u043d stream \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0441\u043b\u0443\u0448\u0430\u0442\u0435\u043b\u044c \u0443\u0432\u0438\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u0441\u044f \u0438\u0437 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0433\u043e stream-\u0430.<\/p>\n<p>  <\/p>\n<p>\u0418\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c <strong>&quot;\u0436\u0434\u0430\u0442\u044c&quot;<\/strong> \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0442 stream-\u043e\u0432, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>combineLatest<\/code> \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u043f\u0430\u0440\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0432\u044b\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0437 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0433\u043e stream-\u0430, \u0434\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043a\u043b\u0435\u0439\u043a\u0438 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0435\u0433\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0438. <\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/camo.githubusercontent.com\/2a1a467dc61743d40f92fd6df1038f4e2a3ded7c\/687474703a2f2f692e696d6775722e636f6d2f3670316931447a2e706e67\" alt=\"&gt; Combine latest\"\/><\/p>\n<p>  <\/p>\n<h3 id=\"dvizhemsya-k-myshleniyu-na-osnove-push-podhoda\">\u0414\u0432\u0438\u0436\u0435\u043c\u0441\u044f \u043a \u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Push \u043f\u043e\u0434\u0445\u043e\u0434\u0430<\/h3>\n<p>  <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u043a\u0430\u043a \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 <code>Observable<\/code>s. \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code>        log(&quot;Before create Observable&quot;);         Observable&lt;Integer&gt; someIntStream = Observable                 .create(new ObservableOnSubscribe&lt;Integer&gt;() {                     @Override                     public void subscribe(ObservableEmitter&lt;Integer&gt; emitter) throws Exception {                         log(&quot;Create&quot;);                         emitter.onNext(3);                         emitter.onNext(4);                         emitter.onNext(5);                         emitter.onComplete();                         log(&quot;Completed&quot;);                     }                 });         log(&quot;After create Observable&quot;);          log(&quot;Subscribing 1st&quot;);         someIntStream.subscribe((val) -&gt; LOGGER.info(&quot;received &quot; + val));         \/\/\u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e         \/\/\u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b(for onError and onComplete) \u0435\u0441\u043b\u0438 \u043c\u044b \u0435\u0435 \u0445\u043e\u0442\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0447\u0442\u043e-\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0435          log(&quot;Subscribing 2nd&quot;);         someIntStream.subscribe((val) -&gt; LOGGER.info(&quot;received &quot; + val));<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0421\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u043e\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0443, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b\u0441\u044f<\/strong>.<br \/>  \u041d\u0435 \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439, \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <code>ObservableOnSubscribe<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430 \u043d\u0435\u0433\u043e \u043a\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043a\u0430 \u043c\u044b \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b\u0438\u0441\u044c \u043d\u0430 <code>Observable<\/code>, \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435\u0442 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0434\u0432\u0438\u0436\u0443\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043a\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>call()<\/code> \u0438 3 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0438\u0437 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435, \u0441\u043b\u0435\u0434\u043e\u043c \u0437\u0430 \u043d\u0438\u043c\u0438 \u0438\u0434\u0435\u0442 \u0441\u0438\u0433\u043d\u0430\u043b, \u0447\u0442\u043e stream \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f. <\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0448\u0435 \u043c\u044b \u0434\u0432\u0430\u0436\u0434\u044b \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b\u0438\u0441\u044c, \u043a\u043e\u0434 \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <code>call(...)<\/code> \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d \u0434\u0432\u0430\u0436\u0434\u044b. \u0422\u0430\u043a \u0447\u0442\u043e \u043e\u043d \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0435 \u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0435\u0449\u0435 \u043f\u043e\u0434\u043f\u0438\u0448\u0435\u0442\u0441\u044f \u0438 \u0442\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u044b\u0432\u043e\u0434:<\/p>\n<p>  <\/p>\n<pre><code>mainThread: Before create Observable   mainThread: After create Observable   mainThread: Subscribing 1st   mainThread: Create   mainThread: received 3   mainThread: received 4   mainThread: received 5   mainThread: Completed   mainThread: Subscribing 2nd   mainThread: Create   mainThread: received 3   mainThread: received 4   mainThread: received 5   mainThread: Completed  <\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0430\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e rx \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c. <strong>RxJava<\/strong> \u043d\u0435 \u0432\u043d\u0435\u0434\u0440\u044f\u0435\u0442 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043c\u0435\u0436\u0434\u0443 <strong>Observable<\/strong> \u0438 <strong>Subscriber<\/strong>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u043d\u0430 &quot;<strong>\u0433\u043b\u0430\u0432\u043d\u043e\u043c<\/strong>&quot; \u043f\u043e\u0442\u043e\u043a\u0435.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a\u043e\u0439 \u0442\u0438\u043f <code>Observable<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u043a\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f <strong><code>cold observables<\/code><\/strong>(\u0445\u043e\u043b\u043e\u0434\u043d\u044b\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u0438). \u0414\u0440\u0443\u0433\u043e\u0439 \u0432\u0438\u0434 \u2014 <strong><code>hot observables<\/code><\/strong>(\u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u0438), \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0434\u0430\u0436\u0435 \u043a\u043e\u0433\u0434\u0430 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u043d\u0430 \u043d\u0438\u0445. <\/p>\n<p>  <\/p>\n<ul>\n<li><code>Cold Observables<\/code> \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u043a\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <strong>\u043a\u0430\u043a CD \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0433\u0440\u0430\u044e\u0442 \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u043f\u0435\u0441\u043d\u0438<\/strong> \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u043a\u0442\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u043b cd \u0432 \u043f\u043b\u0435\u0435\u0440 \u043f\u043e\u0441\u043b\u0443\u0448\u0430\u0442\u044c. <\/li>\n<li><code>Hot Observables<\/code> \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0434\u0430\u0436\u0435 \u043a\u043e\u0433\u0434\u0430 \u043d\u0430 \u043d\u0438\u0445 \u0435\u0449\u0435 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b\u0441\u044f. <strong>\u041a\u0430\u043a \u0440\u0430\u0434\u0438\u043e\u0441\u0442\u0430\u043d\u0446\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u0435\u0441\u043d\u0438 \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0434\u0438\u043e\u0432\u0435\u0449\u0430\u043d\u0438\u0435, \u0434\u0430\u0436\u0435 \u043a\u043e\u0433\u0434\u0430 \u043d\u0438\u043a\u0442\u043e \u0435\u0433\u043e \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u043b<\/strong>. \u0418 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0440\u0430\u0434\u0438\u043e\u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0430, \u0442\u044b \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0448\u044c \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. <em>Hot observable<\/em> \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043a\u0430\u043a \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0436\u0443\u0440\u043d\u0430\u043b (\u043b\u043e\u0433 \u0441\u043e\u0431\u044b\u0442\u0438\u0439).<\/li>\n<\/ul>\n<p>  <\/p>\n<p><code>Subjects<\/code> \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0438\u0434 <code>Observable<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0430\u043a\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>Observer<\/code> (\u043a\u0430\u043a <code>Subscriber<\/code> \u2014 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0448\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 (\u0432\u044b\u0437\u043e\u0432\u043e\u043c <code>onNext()<\/code>) \u0434\u043e \u043d\u0438\u0445) \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0433\u043e\u0440\u044f\u0447\u0438\u0445 <code>Observables<\/code> \u043f\u0440\u043e\u0449\u0435. \u0422\u0430\u043a\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439, \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 <code>ReplaySubject<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442 \u0438\u0445 \u043f\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0435 (\u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443 <code>OutOfMemory<\/code>), \u043f\u043e\u043a\u0430 <code>PublishSubject<\/code> \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u044f.<br \/>  \u0418 \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f <code>Observables<\/code> \u0438 \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432.<\/p>\n<p>  <\/p>\n<pre><code>Observable.just(&quot;This&quot;, &quot;is&quot;, &quot;something&quot;)   Observable.from(Iterable&lt;T&gt; collection)   Observable.from(Future&lt;T&gt; future) - \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a `future` \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f <\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"dobavlenie-v-nash-elk-stek-rabbitmq-emittera-dannyh-otpravlyaemyh-posredstvom-push\">\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u043d\u0430\u0448 ELK-\u0441\u0442\u0435\u043a RabbitMQ \u044d\u043c\u0438\u0442\u0442\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c push<\/h3>\n<p>  <\/p>\n<p>\u041f\u043e \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u0438, \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u0441\u043e \u0441\u0442\u0435\u043a\u043e\u043c ELK, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c ElasticSearch \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u043b\u043e\u0433\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0432 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0449\u0435\u043c \u0441\u0442\u0438\u043b\u0435 &#8216;pull-based&#8217;.<\/p>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u0435\u043c \u043b\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u043c\u0435\u0442\u044c push-based, \u0433\u0434\u0435 \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c &#8216;\u043d\u0435\u0437\u0430\u043c\u0435\u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e&#8217; \u043f\u0440\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u0436\u0443\u0440\u043d\u0430\u043b\u0435, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u043b\u044c\u0448\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0441 \u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043a\u0430\u043a \u043e\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0438 \u0434\u043e \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c <strong>RabbitMq<\/strong>, \u043a\u0430\u043a \u0431\u044b\u0432\u0430\u043b\u043e\u0435 \u0432 \u0441\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u0440\u0435\u043f\u0443\u0442\u0430\u0446\u0438\u0435\u0439 \u0437\u0430 \u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0437\u0430 \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u044d\u0442\u043e <strong>Logstash<\/strong> \u0443\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f <strong>RabbitMQ<\/strong> (\u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f FluentD) \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441 \u043b\u0435\u0433\u043a\u043e\u0441\u0442\u044c\u044e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u043d\u0430\u0448 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 ELK \u0441\u0442\u0435\u043a \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438 \u0432 ElasticSearch \u0438 RabbitMQ.<\/p>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u044b \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e <strong>Logstash<\/strong> \u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0441\u0442\u0438 \u0441\u0435\u0431\u044f \u043a\u0430\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043a\u0430\u043a \u0435\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0438 \u043a\u0443\u0434\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\/\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u0447\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0442\u0438\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0443\u0434\u0430 \u0438\u0445 \u043f\u043e\u0441\u043b\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0434\u0440\u0443\u0433\u0438\u0435 RabbitMQ \u043e\u0447\u0435\u0440\u0435\u0434\u0438.<\/p>\n<p>  <\/p>\n<p>\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u0430\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 <strong>RabbitMQ<\/strong> \u0447\u0435\u0440\u0435\u0437 Logback Appender, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <strong>Logstash<\/strong>. <\/p>\n<p>  <\/p>\n<p>\u041a \u0441\u043b\u043e\u0432\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c: \u041f\u043e\u043a\u0430 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 <code>AmqpAppender<\/code>, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043a\u043e\u0440\u0435\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 <strong>RabbitMQ AMQP<\/strong> (\u0441 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 AMQP 0-9-1, 0-9).<\/p>\n<p>  <\/p>\n<p>ActiveMQ \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 (\u043f\u043e\u043a\u0430 \u0442\u043e\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 AMQP connector) \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0432\u0435\u0440\u0441\u0438\u0438 AMQP 1.0, \u043f\u043e\u043a\u0430 spring-amqp \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c \u0432\u0435\u0440\u0441\u0438\u0439 0-9-1, 0-9, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 1.0), \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u043e\u043b\u043a\u043d\u0435\u0442\u0435\u0441\u044c \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 \u043f\u043e \u0442\u0438\u043f\u0443 <code>'org.apache.activemq.transport.amqp.AmqpProtocolException: Connection from client using unsupported AMQP attempted'<\/code><\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430\u0448\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong>logstash-logback-encoder<\/strong> \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 JSON \u0441 \u0436\u0443\u0440\u043d\u0430\u043b\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 <strong>Logstash<\/strong>. \u041c\u044b \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u0438\u043c logstash \u0432\u044b\u0432\u043e\u0434 \u043d\u0430 \u0442\u043e\u0447\u043a\u0443 \u043e\u0431\u043c\u0435\u043d\u0430 RabbitMQ (exchange).<\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <em>docker-compose<\/em>, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 <strong><em>logstash-rabbitmq<\/em><\/strong><br \/>  \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/p>\n<p>  <\/p>\n<p><code>docker-compose -f docker-compose-rabbitmq.yml up<\/code><br \/>  \u0438 \u0437\u0430\u0442\u0435\u043c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c<br \/>  <code>.\/event-generate.sh<\/code><br \/>  \u0447\u0442\u043e\u0431\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0430 <strong>logstash<\/strong>.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0443\u0434\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <a href=\"https:\/\/github.com\/balamaci\/blog-elk-docker\/blob\/rabbitmq\/logstash\/config-rabbitmq\/logstash.conf\">\u0444\u0430\u0439\u043b<\/a> \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a <strong>logstash<\/strong>. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"https:\/\/www.elastic.co\/guide\/en\/logstash\/current\/plugins-outputs-rabbitmq.html\">rabbitmq-output-plugin<\/a>, \u043a\u0430\u043a \u0441\u0441\u044b\u043b\u043a\u0443:<\/p>\n<p>  <\/p>\n<pre><code>output {       rabbitmq {         exchange =&gt; logstash         exchange_type =&gt; direct         host =&gt; rabbitmq         key =&gt; my_app     } }<\/code><\/pre>\n<p>  <\/p>\n<p>RabbitMQ \u044d\u0442\u043e \u043d\u0435 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 JMS \u0441\u0435\u0440\u0432\u0435\u0440, \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 AMQP \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0435\u0435\u0442 \u0432\u0435\u0441\u044c\u043c\u0430 \u043e\u0442\u043b\u0438\u0447\u043d\u0443\u044e \u043e\u0442 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e \u0434\u043b\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439. <\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"http:\/\/blog.springsource.com\/wp-content\/uploads\/2010\/06\/rabbit-basics.png\" alt=\"amqp\"\/><\/p>\n<p>  <\/p>\n<p>\u0418\u0437\u0434\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0430 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043e\u0431\u043c\u0435\u043d\u0430 (exchange) \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044c \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438.<\/p>\n<p>  <\/p>\n<p>\u0423 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a &#8216;routing-key&#8217;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u043c \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043e\u0431\u043c\u0435\u043d \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u041e\u0447\u0435\u0440\u0435\u0434\u0438 \u043c\u043e\u0433\u0443\u0442 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u043d\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u0447\u0435\u0440\u0435\u0437 \u043a\u043b\u044e\u0447 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438, \u0438 \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u043a\u0438 \u0432 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0435 \u043a\u0430\u043a \u044d\u0442\u0438 &#8216;<strong>logstash.<\/strong>&#8216;<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f <code>AMQP<\/code> \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/spring.io\/blog\/2010\/06\/14\/understanding-amqp-the-protocol-used-by-rabbitmq\/\">\u0437\u0434\u0435\u0441\u044c <\/a>\u0438 <a href=\"https:\/\/www.cloudamqp.com\/blog\/2015-09-03-part4-rabbitmq-for-beginners-exchanges-routing-keys-bindings.html\">\u0442\u0443\u0442<\/a>. \u0422\u0430\u043a \u043c\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 <code>Spring<\/code> \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 c <code>RabbitMq<\/code><\/p>\n<p>  <\/p>\n<pre><code>    @Bean     ConnectionFactory connectionFactory() {         return new CachingConnectionFactory(host, port);     }      @Bean     RabbitAdmin rabbitAdmin() {         RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory());         rabbitAdmin.declareQueue(queue());         rabbitAdmin.declareBinding(bindQueueFromExchange(queue(), exchange()));         return rabbitAdmin;     }      @Bean     SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {         SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();         container.setConnectionFactory(connectionFactory);         container.setQueueNames(queueName);         container.setMessageListener(listenerAdapter);          return container;     }      @Bean     Queue queue() {         return new Queue(queueName, false);     }      DirectExchange exchange() {         return new DirectExchange(&quot;logstash&quot;);     }      private Binding bindQueueFromExchange(Queue queue, DirectExchange exchange) {         return BindingBuilder.bind(queue).to(exchange).with(&quot;my_app&quot;);     }      @Bean     MessageListenerAdapter listenerAdapter(Receiver receiver) {         MessageListenerAdapter messageListenerAdapter = new MessageListenerAdapter(receiver,                 new MessageConverter() {             public Message toMessage(Object o, MessageProperties messageProperties)                     throws MessageConversionException {                 throw new RuntimeException(&quot;Unsupported&quot;);             }              public String fromMessage(Message message) throws MessageConversionException {                 try {                     return new String(message.getBody(), &quot;UTF-8&quot;);                 } catch (UnsupportedEncodingException e) {                     throw new RuntimeException(&quot;UnsupportedEncodingException&quot;);                 }             }         });         messageListenerAdapter.setDefaultListenerMethod(&quot;receive&quot;); \/\/the method in our Receiver class         return messageListenerAdapter;     }      @Bean     Receiver receiver() {         return new Receiver();     }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c \u043e\u0431\u043c\u0435\u043d\u0430 &#8216;logstash&#8217;, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u043a\u043b\u044e\u0447\u0435\u043c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 &#8216;my_app&#8217;. <strong>MessageListenerAdapter<\/strong> \u0432\u044b\u0448\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434 &#8216;receive&#8217; \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u043d \u043d\u0430 \u0431\u0438\u043d\u0435 <code>Receiver<\/code> \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. <\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0432 \u043b\u043e\u0433 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043c\u044b \u043d\u0435 \u0438\u043c\u0435\u0435\u043c \u043d\u0430\u0434 \u043d\u0438\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 <code>hot observable<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u044e\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u0441\u0435\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430\u043c \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u043d\u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043b\u0438\u0441\u044c, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b <strong>PublishSubject<\/strong>.<\/p>\n<p>  <\/p>\n<pre><code>public class Receiver {       private PublishSubject&lt;JsonObject&gt; publishSubject = PublishSubject.create();      public Receiver() {     }      \/**      * Method invoked by Spring whenever a new message arrives      * @param message amqp message      *\/     public void receive(Object message) {         log.info(&quot;Received remote message {}&quot;, message);         JsonElement remoteJsonElement = gson.fromJson ((String) message, JsonElement.class);         JsonObject jsonObj = remoteJsonElement.getAsJsonObject();          publishSubject.onNext(jsonObj);     }      public PublishSubject&lt;JsonObject&gt; getPublishSubject() {         return publishSubject;     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <strong>SimpleMessageListenerContainer<\/strong> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 (\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432\u043d\u0438\u0437 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0438). \u041e\u0434\u043d\u0430\u043a\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 Observable \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0434\u0435\u043b\u044f\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e (\u0432\u044b\u0437\u043e\u0432\u044b <code>onNext<\/code>,<code>onComplete<\/code>, onError \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b):<\/p>\n<p>  <\/p>\n<pre><code>\/\/ \u0422\u0410\u041a \u0414\u0415\u041b\u0410\u0422\u042c \u041d\u0415 \u041d\u0410\u0414\u041e Observable.create(s -&gt; {                       \/\/ Thread A                     new Thread(() -&gt; {                         s.onNext(&quot;one&quot;);                         s.onNext(&quot;two&quot;);                     }).start();                      \/\/ Thread B                     new Thread(() -&gt; {                         s.onNext(&quot;three&quot;);                         s.onNext(&quot;four&quot;);                     }).start();                 }); \/\/ \u0422\u0410\u041a \u0414\u0415\u041b\u0410\u0422\u042c \u041d\u0415 \u041d\u0410\u0414\u041e  \/\/\u0414\u0415\u041b\u0410\u0419\u0422\u0415 \u0422\u0410\u041a Observable&lt;String&gt; obs1 = Observable.create(s -&gt; {                       \/\/ Thread A                     new Thread(() -&gt; {                         s.onNext(&quot;one&quot;);                         s.onNext(&quot;two&quot;);                     }).start();                   });  Observable&lt;String&gt; obs2 = Observable.create(s -&gt; {                       \/\/ Thread B                     new Thread(() -&gt; {                         s.onNext(&quot;three&quot;);                         s.onNext(&quot;four&quot;);                     }).start();                 });  Observable&lt;String&gt; c = Observable.merge(obs1, obs2); <\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u043e\u0439\u0442\u0438 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0432\u044b\u0437\u044b\u0432\u0430\u044f <code>Observable.serialize()<\/code> \u0438\u043b\u0438 <code>Subject.toSerialized()<\/code>, \u043d\u043e \u043c\u044b \u043e\u0441\u0442\u0430\u0435\u043c\u0441\u044f \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 1 <code>Thread<\/code> \u0432 <code>ListenerContainer<\/code>, \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e. \u0415\u0449\u0435 \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432 \u043a\u0443\u0440\u0441\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>Subjects<\/code> \u043a\u0430\u043a \u0448\u0438\u043d\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435 <a href=\"https:\/\/artemzin.com\/blog\/rxjava-thread-safety-of-operators-and-subjects\/\">\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0410 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u043a\u043e\u0434 \u0438 <a href=\"https:\/\/github.com\/balamaci\/rxjava-rabbitmq\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/a>, \u043a\u0430\u043a \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u043b\u0438\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430 <a href=\"https:\/\/balamaci.ro\/reactive-log-stream-processing-with-rxjava-part-2\/\"><strong>Part II<\/strong> (\u0427\u0430\u0441\u0442\u0438 2)<\/a> \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043d\u0430 <a href=\"https:\/\/github.com\/balamaci\/rxjava-playground\"><strong>Rx Playground<\/strong><\/a> \u0442\u0430\u043c \u0432\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432.<\/p>\n<\/p>\n<\/p>\n<\/p>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/329894\/\"> https:\/\/habrahabr.ru\/post\/329894\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p><strong><em><a href=\"https:\/\/balamaci.ro\/reactive-log-processing\/\">Reactive log stream processing with RxJava \u2014 Part l<\/a><\/em><\/strong><\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u043e\u0441\u0442\u0435 \u0430\u0432\u0442\u043e\u0440 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b \u0441\u043b\u0443\u0447\u0430\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <a href=\"http:\/\/www.elasticsearch.org\/\">ELK<\/a> \u0441\u0442\u0435\u043a\u0430 \u0438 \u0441\u0431\u043e\u0440\u0430 \u043b\u043e\u0433\u043e\u0432.<br \/>  \u0421 \u0443\u0447\u0435\u0442\u043e\u043c \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043b\u043e\u0433\u043e\u0432 \u0438 \u0438\u0445 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u0435-\u0444\u0430\u043a\u0442\u043e <strong>\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c<\/strong>. <\/p>\n<p>  <\/p>\n<p>\u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u043d\u0430\u043c \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0440\u044f\u0434\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0437\u0430\u0434\u043e\u043b\u0433\u043e \u0434\u043e \u0438\u0445 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f.*<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-287133","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/287133","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=287133"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/287133\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=287133"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=287133"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=287133"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}