ScalaまたはClojure関数型プログラミングのベストプラクティス


11

私は多くの自習用コーディングを行い、アクター、ソフトウェアトランザクションメモリ、データフローなどの並列プログラミングモデルでいくつかの経験を得ました。

これらのアーキテクチャを実際の生活-高負荷Webアプリケーションに適用しようとすると、どのモデルもデータの耐久性と永続性をサポートしません。実際のタスクでは、最後にデータを保存する必要があります。これは、DBを使用し、DB同期をトラップしなければならないこと、スケーラビリティのボトルネックなどの可能性があることを意味します。

Akkaアクターまたはソフトウェアトランザクションメモリを使用し、最後に永続性を実装するアーキテクチャ(srcまたはtextまたはdiagramまたはblueprints)の良い例を知っている人はいますか?

実際のアプリケーションでのトランザクションメモリ、アクター、データフロー、タプルスペースの良い例/アイデアは大歓迎です。


akkaとstmの両方が必要ですか?
om-nom-nom

永続性を「最後に」と見なすことは珍しいようです。「DB同期のトラップ、スケーラビリティのボトルネックの可能性など」を信じています。それらは物事の終わりではなく、物事の真ん中にいるからこそ問題です。
ダンバートン

永続性は、より頻繁に端よりも起こることに同意

@Stas(1)ScalaとClojure、(2)ベストプラクティスに関連する質問はどうですか?私が読んだのは、(1)言語に依存せず、(2)並行性(特にDurability / Persistence)のみに関連しています。
サキスク

回答:


5

アクター/ STMモデルとデータベースの永続性は多少直交しています-どちらか一方をもう一方なしで簡単に持つことができ、2つを混同する危険があると思います。

耐久性(ACIDのD)を達成することは、トランザクション設定、特にアクター/プロセスがメッセージの受け渡しによって調整される分散設定では非常に複雑です。ビザンチン将軍問題のような厄介な問題に巻き込まれます。

その結果、特定の永続性要件を満たすために、ある程度のソリューションを常に調整する必要があると思います。「万能な」ソリューションはありません。

価値がある(Clojureの視点):


5

アクターモデルは、データ操作を実行するアクターへのメッセージを「コマンド」に相当するものとして使用できるため、コマンド/クエリ責任分離(CQRS)連携して動作します。

それで、それはあなたの持続性の問題と何の関係がありますか?さて、あなたはメモリで作業し、すべてのコマンドをログに書き込みます。これは追加専用であるため安価な操作であり、必要に応じてデータベースをリロードするのに必要な時間を短縮するためにスナップショットを時々ダンプしますログが使用したスペースを回復します)。

これは非常に一般的な手法です。さらにインスピレーションを得るには、VoltDBとRedisをご覧ください。


4

Rich Hickeyには、Datomicと呼ばれるまったく新しい発想があります。これは、永続性、ストレージ、トランザクション管理、およびクエリの分離への新しいアプローチです。不変のレコードに基づいており、Datalog(Prologと機能を共有)と呼ばれるクエリ言語を使用します。主な目標は、簡単な配布とクラウド展開を可能にすることでした。サービスとしてのストレージに依存しています(具体的な実装ではありませんが、有線APIを介して疎結合されます)。

Clojureには、ACIを提供するSTMがあり、Dが欠落しています。DatomicはDを追加します

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