<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>lissdy (李小西)</title>
    <link>https://ruby-china.org/lissdy</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Unicorn 多进程下单例类的数据同步问题？</title>
      <description>&lt;p&gt;问题是这样的，在项目中有一个方法我使用了单例来动态的写入读取数据，在使用 Unicorn 部署的时候，当 worker_processes 数目大于 1 时，即多个 Unicorn 进程，因为进程之间内存不共享，当对该值进行写入操作之后，写入操作只在处理此次请求的进程中生效，而其他进程中的数据仍然为写入操作之前的旧值。
为了确保 Unicorn 多进程下数据的一致性，目前想到的解决方案是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; 持久化数据&lt;/li&gt;
&lt;li&gt; 锁机制，数据在一个进程下被更新后，加入锁；其他进程读到锁后重新刷入新数据&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;但是以上两种都没有很好的解决问题，想麻烦问下各位 Unicorn 或者 Ruby 可否进行进程之间的通信，解决单例类在多进程中不一致的问题。&lt;/p&gt;

&lt;p&gt;附 Unicorn 配置信息：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;worker_processes&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;working_directory&lt;/span&gt; &lt;span class="s2"&gt;"/var/lib/jenkins/workspace/XXX/"&lt;/span&gt; 
&lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="s2"&gt;"/var/tmp/.XXX.sock"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:backlog&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;512&lt;/span&gt;
&lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;3002&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:tcp_nopush&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;timeout&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;

&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="s2"&gt;"/var/tmp/XXX.pid"&lt;/span&gt;    
&lt;span class="n"&gt;stderr_path&lt;/span&gt; &lt;span class="s2"&gt;"/var/tmp/XXX.stderr.log"&lt;/span&gt;   
&lt;span class="n"&gt;stdout_path&lt;/span&gt; &lt;span class="s2"&gt;"/var/tmp/XXX.stdout.log"&lt;/span&gt;   

&lt;span class="n"&gt;preload_app&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;

&lt;span class="no"&gt;GC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;respond_to?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:copy_on_write_friendly&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt;
  &lt;span class="no"&gt;GC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copy_on_write_friendly&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;check_client_connection&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;

&lt;span class="n"&gt;before_fork&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"LOG_LEVEL"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"debug"&lt;/span&gt;
  &lt;span class="k"&gt;defined?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt;
    &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disconnect!&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;after_fork&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="k"&gt;defined?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt;
    &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;establish_connection&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;</description>
      <author>lissdy</author>
      <pubDate>Wed, 27 Jul 2016 12:02:44 +0800</pubDate>
      <link>https://ruby-china.org/topics/30636</link>
      <guid>https://ruby-china.org/topics/30636</guid>
    </item>
    <item>
      <title>求解 Ruby 中的%s 怎么使用？</title>
      <description>&lt;p&gt;在 codewars 上看到这样一道题目：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You probably know the "like" system from Facebook and other pages. People can "like" blog posts, pictures or other items. We want to create the text that should be displayed next to such an item.
Implement a function likes :: [String] -&amp;gt; String, which must take in input array, containing the names of people who like an item. It must return the display text as shown in the examples:
likes [] // must be "no one likes this"
likes ["Peter"] // must be "Peter likes this"
likes ["Jacob", "Alex"] // must be "Jacob and Alex like this"
likes ["Max", "John", "Mark"] // must be "Max, John and Mark like this"
likes ["Alex", "Jacob", "Mark", "Max"] // must be "Alex, Jacob and 2 others like this"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;题目本身没什么难度，但是看到有一个实现是这样的：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;likes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt;
  &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="s2"&gt;"no one likes this"&lt;/span&gt;
  &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="s2"&gt;"%s likes this"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;
  &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="s2"&gt;"%s and %s like this"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;
  &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
    &lt;span class="s2"&gt;"%s, %s and %s like this"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="s2"&gt;"%s, %s and %d others like this"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;麻烦问下大神这里的%s和%是怎么用的，从来没有接触过这样的写法。。。&lt;/p&gt;</description>
      <author>lissdy</author>
      <pubDate>Mon, 25 Jul 2016 22:22:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/30618</link>
      <guid>https://ruby-china.org/topics/30618</guid>
    </item>
    <item>
      <title>美亚购买技术图书能否直邮？</title>
      <description>&lt;p&gt;在美亚看中了这本书，想购买纸质版，但因为图书的特殊性，不确定是否能直邮中国？另外，想请教下各位大神都是通过什么途径获得原版图书的？谢谢！&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/7671930fd90869c719494b13ec8ea4b0.png" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>lissdy</author>
      <pubDate>Sun, 10 Apr 2016 11:09:10 +0800</pubDate>
      <link>https://ruby-china.org/topics/29645</link>
      <guid>https://ruby-china.org/topics/29645</guid>
    </item>
    <item>
      <title>Rails 前后端分离</title>
      <description>&lt;p&gt;想将一个现有 rails 项目重构为前后端分离的模式，请教各位大牛是否有比较成熟的案例或者经验可以分享？&lt;/p&gt;</description>
      <author>lissdy</author>
      <pubDate>Sat, 19 Mar 2016 21:52:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/29395</link>
      <guid>https://ruby-china.org/topics/29395</guid>
    </item>
    <item>
      <title>物理隔离的环境如何部署 ROR 项目？</title>
      <description>&lt;p&gt;如题，服务器环境完全&lt;strong&gt;物理隔离&lt;/strong&gt;，请问各位有什么好的部署方法？&lt;/p&gt;

&lt;p&gt;我目前的做法是编译安装 ruby，将需要的 gems 在本地安装好之后 scp 至服务器，在服务器执行 gem install *.gem 进行离线安装。&lt;/p&gt;

&lt;p&gt;但是，gem 包有依赖关系，离线安装似乎是按照包名顺序安装的，所以 gem install *.gem 并不能一次成功安装所有的 gem。。。&lt;/p&gt;</description>
      <author>lissdy</author>
      <pubDate>Tue, 05 Jan 2016 14:58:45 +0800</pubDate>
      <link>https://ruby-china.org/topics/28614</link>
      <guid>https://ruby-china.org/topics/28614</guid>
    </item>
  </channel>
</rss>
