LASSIC Media らしくメディア
アンチコラプション層とは|レガシー連携の防波堤
新しいシステムを、きれいな設計で作り始めたはずが、古いシステムと連携させるうちに、いつのまにか旧システムの古い用語や独特のクセに引きずられ、新しいほうまで複雑になってしまう——。レガシーとの連携や段階的な移行の現場では、こうした「汚染」がしばしば起こります。これを食い止める考え方が、アンチコラプション層(腐敗防止層)です。新旧のあいだに「通訳」となる層を挟み、旧システムの都合が新システムへ染み込むのを防ぐ仕組みを指します。
耳慣れない言葉かもしれませんが、やっていることは「間に翻訳役を立てる」という素朴な工夫です。本記事では、システムの刷新や連携を検討する情報システム部門の担当者に向けて、アンチコラプション層とは何か、近い考え方との違い、つまずきやすい点、そして活かしどころと外注の勘所を整理します。
目次
アンチコラプション層とは——ただのAPIとの違い
アンチコラプション層(ACL:Anti-Corruption Layer/腐敗防止層)とは、新しいシステムと古いシステムのあいだに置く「変換の層」を指します。新システムが古いシステムと直接やり取りするのではなく、いったんこの層を経由させ、旧システムの古い用語や独特のデータ形式を、新システムにとって扱いやすいきれいな形へ翻訳します。逆向きも同じで、新システムからの依頼を旧システムが理解できる形に直して渡すわけです。いわば、言葉の通じない相手とのあいだに立つ通訳のような役割です。
ここで気になるのが、「それは単なるAPIや連携部品と何が違うのか」という点でしょう。ただの連携であれば、旧システムのデータをそのまま受け渡すだけのこともあります。しかしそれでは、旧システムの古い設計や用語が、そのまま新システムのコードに入り込んでしまうのです。アンチコラプション層のねらいは、単につなぐことではなく、旧システムの「クセ」を新システムに持ち込ませないよう、あいだで積極的に変換し、隔離することにあります。
つなぐだけの連携なのか、旧の影響を遮断する翻訳役なのか——ここに違いがあります。この層があることで、新システムは旧システムの事情に振り回されず、自分たちのきれいな設計を保てるのです。旧システムをいじらずに済むという利点もあります。守りたいのは、新しく作るシステムの設計の清潔さ。そのための防波堤が、腐敗防止層です。
この記事のポイント
- アンチコラプション層は、新旧システムのあいだで用語や形式を翻訳し、旧の影響を隔離する層です。
- ただつなぐ連携と違い、旧システムの古い設計が新システムへ染み込むのを積極的に防ぎます。
- 段階的な移行のあいだ、新旧を切り離しておく防波堤として力を発揮します。
なぜ必要なのか
アンチコラプション層が求められる背景には、古いシステムと新しいシステムの「言葉」が違う、という問題があります。長年使われてきたシステムは、その時代の設計や、業務の都合に合わせた独特の用語・データの持ち方を抱えていることも多いものです。新しいシステムを、それに合わせて作ってしまうと、せっかくの新設計が古い事情に縛られ、複雑さを引き継いでしまいます。
ここで層を挟まないと、何が起きるでしょうか。旧システムのデータ形式や用語が、新システムのあちこちのコードに直接現れるようになるのです。すると、旧システムの小さな変更が新システムの広い範囲に波及したり、新システムを読む人が旧システムの事情まで理解しないと手を出せなくなったりします。これでは、新しく作った意味が薄れてしまうでしょう。アンチコラプション層は、この染み込みを一箇所でせき止める役割を担います。旧との違いを吸収する場所を層として一点に集めておけば、影響が広がるのを防げ、新システムの内側はきれいに保てるわけです。だからこそ、事情の異なる古いシステムと長くつき合うほど、この層の値打ちが増します。
どう働くのか
アンチコラプション層が実際にどう働くのか、やり取りの流れを追うと、役割がつかめます。全体像を押さえておくと、自社の連携でどこに置くべきかを考えやすくなります。この関係を図にすると、次のとおりです。
新システムが旧システムの機能を使いたいとき、まず依頼をアンチコラプション層へ渡します。層は、その依頼を旧システムが理解できる用語や形式に翻訳し、旧システムへ問い合わせます。旧システムから返ってきた答えは、たいてい古い形式のままです。層はそれを、新システムにとって扱いやすいきれいな形へ直してから返します。この往復の翻訳を層がすべて引き受けるため、新システムのコードには旧システムの用語が一切現れません。新システムは、あたかも最初からきれいな相手と話しているかのように振る舞えるわけです。旧システム側も、いつもどおりのやり取りをするだけで、変更を求められません。両者のあいだに立って差を吸収する——これが腐敗防止層の働きです。
つまずきやすい難所
アンチコラプション層にも、あらかじめ想定しておきたい難所があります。踏まえておくと、「層を作ったのに、かえって足かせになった」という事態を避けやすくなります。
一つ目は、作り込みの負担です。翻訳の層は、それ自体を設計し、作り、保守する手間がかかります。連携が少ない場面にまで大がかりな層を用意すると、労力に見合いません。二つ目は、性能への影響です。あいだに一段挟むぶん、やり取りにわずかな遅れが生まれます。頻繁で大量のやり取りがある場合は、この点への目配りが要ります。三つ目は、翻訳の取りこぼしです。旧システムの用語や形式を新システムの形へ移すとき、意味のずれや抜けがあると、かえって不具合の温床になります。両者の対応づけを丁寧に確かめておく必要があります。四つ目は、層の肥大化です。旧システムの事情を吸収する場所であるだけに、放っておくと複雑さがこの層に溜まっていきます。移行が進んで旧システムが不要になったら、層も一緒に畳む、という出口を描いておくことが大切です。いずれも、「守りのための層が、いつのまにか新たな重荷になる」という落とし穴です。
活かしどころ
アンチコラプション層は、どんな場面でも要るわけではありません。使いどころを見極めると、無駄な作り込みを避けられるはずです。整理しました。
| 場面 | 層が役立つか | 理由 |
|---|---|---|
| レガシーを段階的に移行中 | 役立ちやすい | 新旧が並行する期間、新を汚染から守れる |
| 事情の違う外部システムと連携 | 役立ちやすい | 相手の都合を自社設計に持ち込まずに済む |
| 単純で少量の連携だけ | 役立ちにくい | 層の手間が見合わないことがある |
とりわけ力を発揮するのが、ストラングラーフィグ・パターンによる段階的な移行のあいだです。新旧のシステムがしばらく並行して動くこの時期に層を挟んでおくと、育てている新システムを、旧システムの影響から守りながら移行を進められます。マイクロサービスへの分割で、事情の異なるサービスどうしの境界を守りたいときにも役立つ場面です。逆に、連携が単純で量も少ないなら、層を設けず素直につないだほうが早いこともあります。手間と得られる守りを天秤にかけて、置くかどうかを決めるとよいでしょう。
外注時に確認しておきたい点
アンチコラプション層の設計や実装を外部に委託する場合は、次の点を事前にすり合わせておくと、認識のずれを防ぎやすくなります。まず、どの連携に層を設けるのかという範囲です。すべての連携に層を挟むのか、汚染を防ぎたい要所に絞るのかで、手間が大きく変わります。次に、新旧の用語やデータ形式の対応づけです。ここが翻訳の中身にあたり、丁寧に確かめておかないと、意味のずれが不具合につながります。現状の把握を踏まえて、一緒に整理しておきたいところです。
さらに、層をいつまで使い、いつ畳むのかという出口も、はじめに描いておきたい点です。段階的な移行に合わせて設ける場合、旧システムが役目を終えたら層も不要になります。ここを決めておかないと、使われない層が残り続けます。あわせて、性能への影響をどこまで許容するか、どう確かめるかも共有しておくとよいでしょう。レガシー刷新の全体計画のどこに位置づくのかを踏まえたうえで、設計だけを頼むのか、移行の伴走まで含めて依頼するのかを明確にしておくと、任せたあとのつまずきを抑えやすくなります。
まとめ:腐敗防止層で押さえる3つの視点
アンチコラプション層は、新旧システムのあいだに翻訳の層を挟み、旧システムの古い用語や設計が新システムへ染み込むのを防ぐ仕組みです。押さえておきたい視点は3つに整理できます。第一に、ただつなぐ連携との違いを理解し、旧の影響を積極的に隔離するための層だと捉えること。第二に、段階的な移行や事情の違う外部との連携で力を発揮する一方、単純な連携には手間が見合わないこともあると見極めること。第三に、作り込みの負担や性能への影響、そして層をいつ畳むかという出口を、始める前に描いておくことです。この3点を踏まえておけば、「新システムを守るための層が、いつのまにか新たな重荷になる」という事態を避けやすくなります。どこに層を置くかの見極めや設計に不安があれば、外部の手を借りるのも一つの選択肢です。
よくある質問
アンチコラプション層と、ただのAPIや連携部品は何が違うのですか。
ただの連携は、旧システムのデータをそのまま受け渡すだけのこともあり、その場合は旧の用語や設計が新システムのコードに入り込みます。アンチコラプション層は、あいだで積極的に変換し、旧の影響を新システムに持ち込ませないよう隔離することをねらいます。単につなぐのか、旧を遮断する翻訳役を置くのか、という違いだと捉えると分かりやすいでしょう。
なぜ「腐敗防止」という名前なのですか。
古いシステムの設計や用語が、新しいシステムの設計に入り込んで「汚染」してしまうのを防ぐ、という役割に由来します。放っておくと、せっかくきれいに作った新システムが、旧システムの事情に縛られて複雑になっていくのです。それを食い止める防波堤の役目から、腐敗を防ぐ層と呼ばれています。
どんなときに使うと効果的ですか。
レガシーシステムを段階的に移行していて、新旧が並行して動く期間に、育てている新システムを旧の影響から守りたいときに効果的です。また、事情の異なる外部システムと連携し、相手の都合を自社の設計に持ち込みたくない場合にも役立ちます。逆に、連携が単純で量も少ないなら、層を設けないほうが早いこともあります。
デメリットはありますか。
あいだに層を挟むぶん、設計・実装・保守の手間がかかり、やり取りにわずかな遅れも生まれます。また、旧システムの事情を吸収する場所であるだけに、放っておくと複雑さがこの層に溜まりがちです。移行が進んで旧システムが不要になったら層も畳む、という出口を描いておくと、こうした重荷を抑えられます。
外注する場合、どこまで依頼できますか。
どの連携に層を設けるかの範囲決めから、新旧の用語・データ形式の対応づけ、翻訳の設計と実装、移行に応じた層の畳み方まで、範囲を分けて依頼できます。ただし、どこを汚染から守りたいかや、いつ層を畳むかは自社の移行計画に左右されるため、委託先任せにせず一緒に決めるのが望ましいところです。設計だけか移行の伴走まで含めるかを明確にしておくと引き継ぎやすくなります。
著者:テレリモ総研編集部 鈴木 亮佑
レガシー連携・腐敗防止層のご相談はLASSICへ
元請(プライムベンダー)として、層を置く範囲の見極めから用語・形式の対応づけ・翻訳の設計実装・移行に応じた層の畳み方まで、貴社のシステムに合わせてご提案します。まずはお気軽にご相談ください。
ご不明な点はお問い合わせフォームからもご連絡いただけます。
- *1 参考:Microsoft「Anti-corruption Layer パターン(Azure Architecture Center)」(https://learn.microsoft.com/en-us/azure/architecture/patterns/anti-corruption-layer)。考え方の一般的な解説の参考として。