分散環境 (「マイクロサービス」) で gRPC と共に Protobuf 3 を使用しています。
Protobuf 3 で設定されていない値または欠落している値をサポートしていないため、コントラクトの加算性に関連する次の問題が発生しました。
Service Aと、 Team BとTeam Cが所有する2 つのコンシューマー サービスBとCがあるとします。
フィールド、たとえばブール値をサービスAのコントラクトに追加すると、最初はデフォルト値があり、データベースにそのまま書き込まれます。
次に、チーム Bは更新されたコントラクトを使用して話すようにサービスを更新し、フィールド値として「true」を渡します。次に、チーム Cは引き続き古いコントラクトを使用し、同じサービスを呼び出します。値は false に置き換えられます。でもチームCはそんなつもりはなかったし、その分野のことを全く知らなかった。
したがって、サービス A は契約をまったく延長できません。さまざまな理由でまだ更新されていないコンシューマーはデータに損害を与える可能性があり、サービス A はそれに対して何もできないからです。
Thrift では、そのようなことは単一のチェック ( .isSet()
) だけで行われます。
プリミティブをオブジェクトにラップするなどの汚い回避策がありますが、ライブラリ実装固有の参照によるチェック (少なくとも Java では) を使用する必要があります。また、最終的にはすべてをラッパーでラップする必要がありますが、ご想像のとおり、これも優れたソリューションではありません。
2017 年の Protobuf 3 でこのような状況を管理するために使用するベスト プラクティスは何ですか? チーム/サービス間の契約の更新をどのように管理/調整しますか? ありがとう
注:この質問は、設定されていない/欠落している値の検出の欠如を実装する方法に関するものではなく、それをどのように処理し、 Protobuf 3 の哲学に従うかに関するものです。