最近、私はどういうわけか同じタイプの最も原始的で、さまざまなWebプロジェクトで非常に簡単に解決された問題を何とかして疑っています。 さまざまなベース、さまざまな言語、さまざまな活動分野、収益化スキーム。 それらはすべて一つのことで結ばれています-「ビジネスは書き換えを許可しません」というスローガンです。 競合他社からのプロジェクトの市場シェアの拡大と積極的な絞り込みの急速な開発の進行中または完了した段階は、いわゆる巨大な山を生み出しました 「Govnokoda。」 疑わしいアーキテクチャソリューションは、すでに多くの問題を引き起こしているか、将来的にそれらを約束しますが、それらは機能します。 新しい要件の流れにより、コードは言うまでもなく、インフラストラクチャーであってもクリーンアップする時間はありません。 あなたがこの状況に精通しているなら、猫の下でポドスタルジーを作り、新しいことを学び、そして/または私たちに教えてください。 誰に、そして誰に泣くか。
「これはすべて、単なる血統のためのものです」と思慮深く、冷静な読者は言うでしょう。 悪いのは、人気のあるハイエンドになることを夢見ていないWebプロジェクトです。
問題№1:ベース。
Webプロジェクトで最も不快な問題は、常にデータベースに関連しています。 DNSバランシングからnginx構成のアップストリームディレクティブまで、他のすべてを簡単にスケーリングできます。 「クラスタリングについてはどうですか?」思慮深い読者に尋ねます。 それが問題です。 暴力的なデータベースのクラスターを見たのはこれが3度目です。 MySQLを2回、MongoDBを1回。 インデックスは構成されず、テーブル(コレクション-違いは何ですか?)はクリーニングされませんが、クラスターの高価なサーバーは支払われます。 基本的に、これらのサーバーは、インデックス化されていないデータのレイキングとエントロピーの名前で未使用のインデックスの構築に忙しくしています。
この問題のグループは、バックエンド開発者を管理者/ DevOps / NOCから分離するという現在流行の傾向を実践しているオフィスで特に広まっています。
ベースを疲れたままにしておくのが怖いのはなぜですか? はい。注文、顧客、SEOページランクなど、すべてを地獄に失うからです。 そして、なぜホスティング事業者は過払いをすべきなのでしょうか?
個人的に、私は、貧しい子供時代に甘やかされて、すぐに魂の叫びを持っています:ホスティング事業者に支払いをしないで、私により良く支払います。
別の素晴らしいこと:足の下に疲れた疲れたベースがあり、その結果、ほとんどすべてのページでWebサーバーから数秒の応答がある場合、ベースに慎重に触れることなく含浸パフォーマンスを実行します。
問題「n + 1」
レイプベースには2つの大きなタイプがあることが判明しましたが、数ヶ月前、これについて最もおかしなことですが、私は個人的に疑っていませんでした。 「n + 1の問題」を聞いたことがありますか? 私はそのようなことを、幼少期の幼少期に思い出します。 人生では、このような何かが商業プロジェクトに割り込むとは信じていなかったでしょう。 最も簡単な方法は、擬似コードで問題を特徴付けることです。
list = db.query('SELECT * FROM products;') for (item in list){ orders = db.query('SELECT * FROM orders WHERE product_id = ?;', {product_id: product.id}); ... }
. access log - query log , . 50MB access log 20GB query log — . — , - , - .
: webdev — . .
go- . , , ActiveRecord . php js .
:
SELECT p.*, ( SELECT count(*) FROM comments WHERE product_id = p.id) comment_count FROM products p WHERE author_id = ?;
, — . «n+1». LIMIT. JOIN ( GROUP BY) — , — . — . , ORM . — .
- - .
: , , dev.mysql.com/doc/mysql-utilities/1.5/en/mysqlindexcheck.html www.percona.com/doc/percona-toolkit/2.1/pt-duplicate-key-checker.html, , . — , . — unindexed query log ( , ) . — . .
— . , , . MySQL, EXPLAIN SELECT «ROWS examined», query log (long_query_time = 0). , . , , sum(Rows Examined) — . — 95- «Rows Examined» vs «Rows Sent». . www.percona.com/doc/percona-toolkit/2.2/pt-query-digest.html. — . — , , .
. . — , , , « RDB — RDB ». .
PostgreSQL, .SELECT FOR UPDATE ... SKIP LOCKED;
php-. — « » PHP.
, — ? — , . №1 . , - . - , , . , .
: c zip? ? mysqldump? backup?
: , - « », ALTER TABLE - . ? ? ?
10 , . , , 3- — . - . - .
- . , error . , parent_id IN( id).
- . . , - php ? ? — .
, -, / , . — .
«» - — CPU, bandwidth, RAM. , — munin/monit/sa+sar/htop / — .
- . — . UPDATE- , SELECT ( , ) , . PostgreSQL immutable tuples UPDATE .
UP1: terrier PostgeSQL , . Uber . . ?
MySQL . - , . ?
: products2, . . - - — .
: , , () . , , « , ». — bottleneck / .
: ,
№2 —
, , . — .
, — . - , - . — - .
. CodeSniffer code review code quality - «» .
— : - code review. over-pattern-usage. ? , . — . Dependency Injection — , - / , ZF 1.x. — . Repository + Entity — driven db access 100% legacy . , stateless — . ActiveRecord, .
, , SOLID . SOLID — OOP. , - .
: , (, ?) .
: — . , .
, . , ? — , -. Webdev — . apache? .htaccess- ?
№3 —
— . this. , - — / JQuery c ExtJS, / MVC , backbone.js. — , , .
: , es2015 javscript. , jQuery . . , . . , TypeScript JS: , -. .
№4 —
- . , , , . — . , / , / . . , .
- . , . : . .
. ? ?
-. ? zero-time-deployment .
zero-time-deployment. , downtime ?
, . , Jenkins , / / / / / / ? ? , .
-? deny from all ? ?
, . !
. …
.
, .
№0: .
. , , CAP- IT-. .
: , , , . — , . , , — . « ?».
: . .
№1:
. — , , / , , . « . ».
: . , . . — , .
« » — , . . bottleneck?
: .
, — sucks. Back in USSR, . . .
— . - . — , JIRA / Redmine / .
— . , , — . , — . , , « »?
, / — .