なぜそんなに多くのプログラマーがオブジェクト有病率レイヤーを絶対に嫌うのですか?


9

普及率は、バイナリシリアル化と先行書き込みログに基づいて、メモリ内オブジェクトモデルにACIDプロパティを提供する簡単な手法です。それはこのように動作します:

  • スナップショットから始めます。オブジェクトモデルをシリアル化し、ファイルに書き込みます。
  • ジャーナルファイルを作成します。オブジェクトモデルへの呼び出しごとに、呼び出しとその引数をシリアル化します。
  • ジャーナルが大きくなりすぎた場合、シャットダウンしている場合、またはその他の理由で便利な場合は、チェックポイントを実行します。新しいスナップショットを書き込み、ジャーナルを切り捨てます。
  • クラッシュまたはパワーヒットからロールバックまたは回復するには、最後のスナップショットをロードし、ジャーナルに記録されたすべての呼び出しを再実行します。

この作業を行うために必要な予防策は次のとおりです。

  • 可変オブジェクト参照をエスケープさせたり、普及層に入れたりしないでください。RPCを実行しているかのように、何らかのプロキシまたはOIDスキームが必要です。(これは初心者によくある間違いであり、「洗礼問題」と呼ばれています。)
  • 呼び出しから到達可能なすべてのロジックは完全に確定的でなければならず、ビジネスロジックにとって意味のあるI / OまたはOS呼び出しを実行してはなりません。診断ログへの書き込みはおそらく問題ありませんが、システム時刻を取得したり、非同期デリゲートを起動したりすることは、通常はできません。これは、別のマシンまたは別の時間に復元された場合でも、ジャーナルがまったく同じように再生されるようにするためです。(ほとんどの普及コードは、トランザクションのタイムスタンプを取得するための代替時間呼び出しを提供します。)
  • ライターの並行性は、ジャーナルの解釈にあいまいさをもたらすため、禁止されています。

それは...

  • 人々はそれにあまり適していない*プロジェクトにそれを使用しようとした後、彼らのために悪い味を開発しましたか?
  • クラウス・ヴエステフェルトの激しい支持 は人々を止めましたか?
  • 命令型プログラミングモデルが好きな人は、I / Oを計算から分離することを嫌い、代わりに計算をI / Oおよびスレッド呼び出しでインターリーブすることを好みますか?
  • 普及層は概念的にシンプルで、フレームワークの特性に密接に結びついているため、通常はプロジェクト用にカスタムロールされ、それにより、異質/非標準/危険なものになりますか?
  • あなたがやらないように注意しなければならないことをまっすぐに保つのはあまりにも難しいですか?
  • 初心者は、学校で書くことを学んだ2層データベース駆動型アプリとは異なるものに直面すると、爆発するように見えるだけですか?;)

* RAM内データセット全体のフィットは、あなたは作家の同時実行を必要としない、とあなたは、データウェアハウスに、アドホッククエリ、レポート、またはエクスポートを行う必要はありません。SQLiteへの謝罪により、普及は保存ファイルの改善であり、Oracleの代替ではありません。


あは。名前はあるかしら。それはいつも私には理にかなっています、私はそれの名前を持っていませんでした。
greyfade

9
あなたは何について話していますか?
TheLQ 2010

これを聞いたのはこれが初めてです。それは何ですか?
Jonn

説明を追加しました。
ジェフリーハンティン2010

1
ああ..私はコンセプトを知っていますが、これまでに行ったことはありません。私にはかなり気の利いたように見えます。多くの開発者が「絶対に嫌い」ではないことは確かです。
Jonn

回答:


6

問題のいくつかは、非常に具体的な使用例があることです(あなたの適していない理由)。私はこのアプローチを使用するシステムを構築して取り組んできましたが、実際にこの問題である問題がある場合、それは素晴らしい解決策になる可能性があります。

もう1つの部分は、10年以上前に見つけたカスタムデータストレージの痛い部分によく似ており、同じ落とし穴(バッチ更新されたbtreiveなど)がいくつかあることです。 「カスタムすぎる」という点だけでなく、丁寧に動作する既成のパーツを見つけるのも難しくなります。

最後の部分は、多くの場合、クエリを実行するのが非常に難しくなる可能性があり、一般的に人々は今すぐに答えを得ることができることに慣れているということです。


11

最初に、非常に多くの開発者が絶対に嫌いであることを示す必要があると思います。そうではないと思います。ファウラーがしばらく前に、このための種類のパターンをここで正式化したと考えてください


ええ、私は少し混乱しています。あなたが正しい理由でそれらを使うなら、それらは素晴らしいツールのように見えます。
Matt Olenik

私はこれを言っているだけです、同僚からこれについて絶対に驚くほど多くの悲しみがあったからです。
ジェフリーハンティン2010

1
@ジェフリー・ハンティン:彼らは怠惰で心を閉じているように聞こえます。
Steven Evers

1
ああ、そしてパターンの実際の要はc2.com/cgi/wikiですか?TransactionTape
Jeffrey Hantin

4

質問に対する答えは、理論は単純ですが、実際はそうではないということです。

そのようなセットアップをテストするだけで、何十ものテストケースが必要になり、マルチプロセスまたはマルチスレッドコードを追加すると、永続性とリカバリの両方で、テストが必要な数百の可能な状態にジャンプします。

CICS、Tuxedo、Weblogic、Websphere、JBOSS、.NETなどのトランザクションモニターは、これらすべての機能をクリーンでテストされた方法で提供します。また、どのデータベースでも、ほとんどのアプリケーションに「十分な」トランザクション/永続性を提供します。

主にそのホイールのケースは、ずっと前に発明され完成されたものです。


これと、多くの「建築家」は、その設計が解決する必要のある問題にどれほど不適切であろうと、何でも押し付けようとする「風味」を好む傾向があります。
2010年

@jwentingそれで、それは「激しい主張」のポイントに該当しますか?
ジェフリーハンティン2013年

2

特にメモリ内で実行するときにACIDへの準拠を必要としないほとんどのシステムでは、前提条件はコードを書くのに少し面倒です。オーバーヘッドも少し厄介に聞こえます-そこには多くの状態追跡が含まれています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.