AWSでアベイラビリティゾーンをまたいでのアクセスが想像以上に遅かった話

# 事の発端
弊社サービス<a href="https://yourmystar.jp">「あなたのマイスター」</a>ではAWSを利用し、以下のようなアーキテクチャで運用しています。

<img width="1433" alt="スクリーンショット 2018-04-02 9.52.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/217483/b81b4344-9fd0-4911-f41b-ed3b9afcb8bd.png">

が、速度がCVRに直結するシステムに於いて
<b>どうにも「たまーにレスポンスが遅いときがあるけどサーバの負荷とかは特に上がっていない」という不思議な症状が発生するようになりました。</b>

- とあるURLに対するControllerの処理時間(ms)

<table>
    <tr>
        <th>サーバA(ap-northeast-1c)</th>
        <th>サーバB(ap-northeast-1a)</th>
    </tr>
    <tr>
        <td>185</td>
        <td>295</td>
    </tr>
    <tr>
        <td>114</td>
        <td>305</td>
    </tr>
    <tr>
        <td>112</td>
        <td>297</td>
    </tr>
    <tr>
        <td>257</td>
        <td>311</td>
    </tr>
    <tr>
        <td>125</td>
        <td>303</td>
    </tr>
    <tr>
        <td>198</td>
        <td>296</td>
    </tr>
    <tr>
        <td>114</td>
        <td>305</td>
    </tr>
    <tr>
        <td>119</td>
        <td>291</td>
    </tr>
    <tr>
        <td>147</td>
        <td>325</td>
    </tr>
    <tr>
        <td>210</td>
        <td>372</td>
    </tr>
    <tr>
        <td>149</td>
        <td>298</td>
    </tr>
    <tr>
        <td>176</td>
        <td>305</td>
    </tr>
    <tr>
        <td>130</td>
        <td>369</td>
    </tr>
    <tr>
        <td>143</td>
        <td>319</td>
    </tr>
    <tr>
        <td>129</td>
        <td>437</td>
    </tr>
    <tr>
        <th>平均</th>
        <th>平均</th>
    </tr>
    <tr>
        <td>153.87</td>
        <td>321.87</td>
    </tr>
</table>

<b>うーん…下手すると処理時間が倍くらい違う...</b>

# いろいろ調べてみるとアベイラビリティ―ゾーン(AZ)が問題らしい
EC2インスタンスは両方共 **m4.large** のため、マシンスペックは同じです。
また、監視グラフを見てみても特定のインスタンスに負荷がかかっている。
いろいろ調べてみると、どうにも
<b>「アベイラビリティゾーン(AZ)をまたいだ通信は結構コストが掛かるよ！」</b>
という記事が見つかりました。(<a href="http://xoxo-infra.hatenablog.com/entry/2013/05/02/032918">AZ間のレイテンシについて </a>)

<img width="1397" alt="Banners_and_Alerts_と_ユアマイスターシステム_20180110_pdf（2___5ページ）.png" src="https://qiita-image-store.s3.amazonaws.com/0/217483/2ef396cc-bd4f-c85f-04a7-3c8b3702e2f4.png">

あなたのマイスターのシステムではELBで負荷分散しているEC2の片側のみが **ap-northeast-1a** 、それ以外のEC2、RDS、Elasticsearch、Redisが全て **ap-northeast-1c** で構成されている **Multi-AZ** 構成になっています。
もしやこれかが原因か？と思ったんですが、ちょっと記事が古い...
しかもAWSの人に相談したときはMulti-AZで問題ないって言って推奨されたしなぁ...

さらに調べてみると***「複数AZ間の遅延は1、2ミリ秒であるため、（アプリケーションは）2つのAZに対して同時にコミットができる。」***(<a href="http://www.atmarkit.co.jp/ait/articles/1411/20/news106_2.html">AWSのデータセンターの中身を、設計総責任者が話した (2/2)</a>)とか書いてある。

うーん...どっちが本当なのかよく分からんなぁ...

# 実際にMulti-AZからSingle-AZに変更してみた
半信半疑のままAMIコピーを作成し、ap-northeast-1cにインスタンスを立ててELBのターゲットに登録しap-northeast-1aのインスタンスを切り離してみました。

<table>
    <tr>
        <th>サーバA(ap-northeast-1c)</th>
        <th>サーバB(ap-northeast-1a)</th>
        <th>サーバC(ap-northeast-1c)</th>
    </tr>
    <tr>
        <td>185</td>
        <td>295</td>
        <td>116</td>
    </tr>
    <tr>
        <td>114</td>
        <td>305</td>
        <td>154</td>
    </tr>
    <tr>
        <td>112</td>
        <td>297</td>
        <td>201</td>
    </tr>
    <tr>
        <td>257</td>
        <td>311</td>
        <td>187</td>
    </tr>
    <tr>
        <td>125</td>
        <td>303</td>
        <td>165</td>
    </tr>
    <tr>
        <td>198</td>
        <td>296</td>
        <td>132</td>
    </tr>
    <tr>
        <td>114</td>
        <td>305</td>
        <td>266</td>
    </tr>
    <tr>
        <td>119</td>
        <td>291</td>
        <td>198</td>
    </tr>
    <tr>
        <td>147</td>
        <td>325</td>
        <td>142</td>
    </tr>
    <tr>
        <td>210</td>
        <td>372</td>
        <td>137</td>
    </tr>
    <tr>
        <td>149</td>
        <td>298</td>
        <td>184</td>
    </tr>
    <tr>
        <td>176</td>
        <td>305</td>
        <td>176</td>
    </tr>
    <tr>
        <td>130</td>
        <td>369</td>
        <td>166</td>
    </tr>
    <tr>
        <td>143</td>
        <td>319</td>
        <td>113</td>
    </tr>
    <tr>
        <td>129</td>
        <td>437</td>
        <td>154</td>
    </tr>
    <tr>
        <th>平均</th>
        <th>平均</th>
        <th>平均</th>
    </tr>
    <tr>
        <td>153.87</td>
        <td>321.87</td>
        <td>166.10</td>
    </tr>
</table>

<b>揃った！！！めっちゃ遅延しとるやん！！！数msっていう話はどこ行った！！！</b>

# まとめ
- AZ間の通信は想像以上に遅い(コネクションプールの仕組みがあるDBアクセスでも結構時間がかかるっぽい)
- 速度を重視するサービスで、インフラの障害を許容できるのであればSingle-AZ環境での運用をおすすめします