name: overview class: title, smokescreen, shelf, no-footer # 第05回 書きこみと競合状態 <div class=footnote> <small> </small> </div> --- class: compact,img-right # 保存できなければプログラムの資格など無い(よね?) ![](../../images/computer-concept.png) - CPUやメモリがあればPCは動作しますが、データが保存できないとなると大変めんどうです(;_;) <small> - 電源を入れるたびに全部よみこましなおすことになりますな (1940-1950年代?) </small> - しかしながら、複数のユーザがいるときにデータを<B>保存つまり「ストレージに書きこむ」のは非常に難しい話</B>です <small> - つまり、ユーザが一人なら、そんなに難しくないけれど、二人以上いたら一気に困難に </small> --- class: compact,img-right # 例: www.pyを使いショッピングサイトを作成したとき ![](../../images/www-minimum.png) <small> - (演習ではユーザ一人ですが)普通は - 複数ユーザが同時にサイトを利用します <br> (お客さんがたくさんいないとダメでしょ?) - システムの裏側では次のような動作が必須 - ショッピングカートの内容を一時保存 - 購入したら在庫の数を適切に減らす - 送付先の住所をRDBMSから取り出す - 出荷の指示を出す - 出荷指示済の履歴を残す <br> などなど... </small> --- class: compact,col-2 # 深く考えずに在庫処理を書くと...こうなる - それらしく見えますが... - 右の例をよく見ると、 売れた数と在庫の数が合っていません - `在庫 = 40 -> 39`が2回ある - `在庫 = 38 -> 37`が2回ある - 演習で体験してもらいます <br> (体験だけです、コーディングなし) <small><small> ``` $ python3 zaiko.py 在庫 = 50 -> 49 | ユーザ 1が一つ購入 (合計 1個売れた) 在庫 = 49 -> 48 | ユーザ 2が一つ購入 (合計 2個売れた) 在庫 = 48 -> 47 | ユーザ 3が一つ購入 (合計 3個売れた) 在庫 = 47 -> 46 | ユーザ 4が一つ購入 (合計 4個売れた) 在庫 = 46 -> 45 | ユーザ 5が一つ購入 (合計 5個売れた) 在庫 = 45 -> 44 | ユーザ 6が一つ購入 (合計 6個売れた) 在庫 = 44 -> 43 | ユーザ 7が一つ購入 (合計 7個売れた) 在庫 = 43 -> 42 | ユーザ 8が一つ購入 (合計 8個売れた) 在庫 = 42 -> 41 | ユーザ 9が一つ購入 (合計 9個売れた) 在庫 = 41 -> 40 | ユーザ10が一つ購入 (合計10個売れた) 在庫 = 40 -> 39 | ユーザ11が一つ購入 (合計11個売れた) 在庫 = 40 -> 39 | ユーザ12が一つ購入 (合計12個売れた) 在庫 = 39 -> 38 | ユーザ13が一つ購入 (合計13個売れた) 在庫 = 38 -> 37 | ユーザ14が一つ購入 (合計14個売れた) 在庫 = 38 -> 37 | ユーザ15が一つ購入 (合計15個売れた) ... 以下略 ... ``` </small></small> --- class: compact,img-right # どうするのが正しい?(AWS前提での模範解答) <div class=footnote> <small> <small> (脚注1) ガチで「書きこむのは難しい」を説明したら、この話題だけで1学期くらい授業が出来るとおもうので、以下略です <br> (脚注2) <B>これの劣化版を最終課題(必須)で作ってもらいます</B>。On!たのしみに </small> </small> </div> ![](../../exercise/images/sysbuild-plan-final.png) <small> - <B>難しい(書きこむ)部分はAWSのサービスを買え</B> <small> - 一般に分散システム <br> これは構築も運用・保守も難しいので、難しいものは素直にAWSを買うべきです。 それがクラウドのいいところだから - 具体例 - <B>Aurora (AWS RDS</B>, RDBMS=SQLサーバ) - <B>ElastiCache</B> (補助的に利用,演習でやります) - ロードバランサー(AWS <B>ELB</B>) </small> - アプリケーション(例:www.py)は各自で作りこむものですが、 必ず<B>ステートレス</B>で素直に作る <small> - EC2ごと落ちたとしても大丈夫なように、 アプリケーションは大事なデータを持ってはいけません - ログイン情報、カート情報 - トランザクションなどを地道に書く(<-素直) </small> </small>