web-dev-qa-db-ja.com

オフラインモードのPOSに適したソフトウェアアーキテクチャは何ですか?

私はブラジルに数十の顧客で稼働している小さな配達店(ピザ屋、日本料理など)のソフトウェアを所有しており、完全なPOS( POS )ソフトウェア。

ただし、開発に苦労してきた重要な機能がオフラインモードです。ブラジルのインターネットは商用利用には信頼性がないため、一部の地域では通常、週に数回の切断から隔日0〜90分の切断まで問題が発生します。

ソフトウェアはC#/ Windowsフォームで作成され、データベースはAzureでホストされているMySQLです。顧客は同じデータベースに接続し、すべてのテーブルにはCompanyIdがあります。お客様のローカルネットワークには、MySQLサーバーではなくデータベースをオンラインにすることが戦略的です。

私はかなりの量の研究をしましたが、解決策や方向性はこれまで見つかりませんでした。

私たちは1つのアプローチをとりました。インストールがMySQLもインストールし、会社のデータ(ある場合)をダウンロードすることを考慮し、ソフトウェアはローカルデータベースに接続し、数秒ごとにローカルからクラウドデータベースに変更を加えます。しかし、それは困難であることがわかり、コード設計に影響を与えました(現在の顧客のため、ゼロから実行することはできません)。

今のところ、このモードを最初から作成し、以前に移行することを検討します。

5
Talles Santana

私が多くの人が取っているデフォルトのオプションは、同じ構造のローカルデータベースを用意し、それをサーバーと同期することです。これはすばやくセットアップでき、実装に使用できるさまざまなツールとライブラリがあります。

しかし、これは良い方法だとは思いません。

私は、接続が利用可能になり処理されるまでアクションがローカルに保存される、キュー/イベントストアベースのアーキテクチャを使用します。たとえば、販売を行うたびにサーバーで実行する必要がある在庫レベルを更新する必要があるとします。

販売が完了したら、必要なすべての情報を含む「在庫レベルの更新」タスクを作成し、それをキュー(単純なデータベーステーブルの場合もあります)に入れます。

次に、キューを監視するバックグラウンドプロセスがあり、インターネット接続が利用可能な場合は、アイテムを一度に1つずつキューから取り出し、サーバーに送信して処理します。

これにより、アクションを待機しているタスクの数と数をユーザーに示すことができ、競合が発生したときに使用するロジックを制御できます。つまり、在庫はありませんが、売却はしばらく前に完了しました。

また、懸念事項をより適切に分離できます。ローカルデータベースは、サーバーベースのデータベースとは完全に異なる構造にすることができます。

10
Ewan