1

PHPで書かれたアプリがあります。フロントエンドはjavascriptを多用しています。一般に、ページのリロードが必要な通常のアプリケーションの場合、継続的なデプロイは実際には問題になりません。理由は次のとおりです。

  • アプリは、ビルド タグを使用してデプロイできます: myapp-4-3-2013-b1myapp-4-3-2013-b2など。
  • ユーザーがページをロードすると (フロント コントローラー パターンを使用しています)、ビルドタグを挿入でき、正しいビルド タグを使用してアプリ ディレクトリからファイルがロードされます。
  • 古いリクエストが終了すると、新しいビルド タグに移動するため、古いビルドを長時間保持する必要はありません。
  • データベースとユーザー データに互換性がないという問題は、リクエストが完了した後に新しいビルドに移動するため、それほど高くはありません (これについては後で詳しく説明します)。

さて、私たちのアプリの問題は、スムーズなページ読み込みのために AJAX を多用していることです。さらに、ユーザーがアプリケーションをナビゲートするときにページがまったく更新されないため、ブラウザーが更新されていない限り、保存されていないデータを現在のブラウザー セッションに保持し、再度アクセスすることができます。

継続的な展開を実現したい場合、これはより大きな問題につながります。

  • ユーザーのビルドタグをセッションに保持し (ユーザーが最初のリクエストを行ったときに設定)、ログアウトして再度ログインした後にのみ新しいビルドタグに切り替えることができます。データベース スキーマが変更されたり、ディスクに書き込まれるファイルの形式が新しいビルドで変更されたりすると、これを調整する方法がないため、これは明らかに悪いことです。

  • すべての新しいリクエストを新しいビルド タグに強制しますが、クライアント側の JavaScript を変更する可能性があり、セッションを持つすべての人に新しいビルド タグをすぐに強制すると、多くのことが壊れる可能性があります。

明らかに、プッシュするすべてのビルドで上記が発生するわけではなく、多く発生しないことを願っていますが、テストに合格したすべてのビルドをデプロイできるように、フールプルーフ プロセスを構築したいと考えています。同時に、デプロイされてテストに合格したすべてのビルドが、セッションを実行しているクライアントで不注意に中断され、多数の問題が発生しないようにしたいと考えています。

私はいくつかの調査を行いました.Googleが(少なくともGoogleグループで)行うことは、クライアントにメッセージをプッシュしてアプリケーション(ブラウザウィンドウ)を更新することです。ただし、その場合、保存されていないクライアント側のデータ (保存されていないメッセージなど) はすべて失われます。

最近、AJAX とローカル データを使用するアプリケーションが非常に一般的であることを考えると、ユーザー/クライアントへの混乱を最小限に抑える、これを処理するよりインテリジェントな方法は何ですか?

4

1 に答える 1

0

あなたの投稿を読む前に継続的デプロイについて考えたことはありませんでしたが、それはかなり良いアイデアのように思えます! これがうまくいく例をいくつか持っています。

あなたの問題を解決するための私の考えは、あなたの最初の提案(よりクリーンです)に行き、次のようなデータベーススキーマの変更を回避することです:

ビルド タグ環境の外部にある、データベースまたはファイル アクセスを処理する API サービス レイヤーをアプリケーションに実装します。たとえば、、myapp-4-3-2013-b1およびdb-servicesフォルダーがあります。

db-services一連のバージョン管理されたサービスを使用して、データベースとの対話を提供します。たとえば、registerNewUser2()またはprocessOrder3().

データベース スキーマを変更する必要がある場合は、そのサービスの新しいバージョンを提供し、ビルド タグ環境をアップグレードして新しいバージョンを確認します。また、古いスキーマから新しいスキーマへのアップグレードを処理するレガシー サービスも提供します。

たとえば、次のように新しいユーザーを登録したとします。

registerNewUser2(username, password, fullname) {
    writeToDB(username, password, fullname);
}

また、スキーマを更新してユーザーの生年月日を追加する必要がありました。

registerNewUser3(username, password, fullname, dateofbirth) {
    writeToDB(username, password, fullname, dateofbirth);
}

registerNewUser2(username, password, fullname) {
    registerNewUser3(username, password, fullname, NULL);
}

新しいビルド タグは call に変更されますがregisterNewUser3()、以前のビルド タグはまだ を使用していregisterNewUser2()ます。

そのため、古いビルド タグは引き続き機能しますが、登録された新しいユーザーの生年月日は NULL になります。更新されたビルド タグを使用すると、生年月日がデータベースに正しく書き込まれます。

db-services新しいビルドタグをロールアウトしたらすぐに、またはビルドタグをロールアウトする前に、すぐに更新する必要があります。

全員が新しいバージョンを使用していることを確認したらregisterNewUser2()、次のバージョンの を削除できますdb-services

これは、古い API 呼び出しと新しい API 呼び出しの間の変換を正しく処理していることを確認するのは非常に複雑ですが、継続的な展開を既に処理している場合は実現可能かもしれません。

于 2013-03-15T06:38:20.830 に答える