Database Design and Implementation 2ndを読みつつ、Java関連を学んだ足跡

Chapter 2: JDBC

Explicit Transaction Handling

  • JDBCで、setAutoCommit(false)を明示的にすることでトランザクション境界を制御するが、Spring BootなどのFWでは、Controller In/Outでそのようになっているのか

    • @Transactional の宣言的アノテーションを使うと、そのメソッドがトランザクション境界となる
  • この@Transactional のようなアノテーションの仕組み(AOPの実装)は?

    • 実行時にclass fileを書き換える、作成する といった黒魔術的な技術によって支えられている

    • Javaのclass fileはフォーマットがかっちりしているので、ごにょごにょできるわけだ

    • 黒魔術は危険な側面もあるが、便利な側面もある

      However, this picture changes when creating libraries that need to interact with arbitrary code and unknown type hierarchies. In this context, a library implementer must often choose between either requiring a user to implement library-proprietary interfaces or to generate code at runtime when the user’s type hierarchy becomes first known to the library.

      Byte Buddy - runtime code generation for the Java virtual machine

      なるほど。インタフェースを実装してもらうか、ランタイムに情報を集めるしか無い。
      黒魔術によって、POJO化できる。
      が、ソースコードを追ってるとき、裏で何をやってるかわけわからん みたいなことにはなる。

    • Spring Frameworkでは、Proxyという仕組みと呼ばれており、そのインスタンスが実際には実行され、周辺処理が挟み込みされる.

    • AspectJ

    • 参考

20211017の調べ

UNYSYS技報

  • No146 ハイブリッドクラウドの最新動向 を読んで

  • IBM と Redhat

  • VMware

    • SDDC (Software Defined Data Center)を各パブリッククラウドと連携して、hostedな private cloudを提供
  • Nutanix

    • Invisible Infra がコンセプトの会社
      • ハイブリッドクラウド環境をone interfaceで管理する など
    • HCI, private cloud, hybrid cloud
  • パブリッククラウド on オンプレの動き

    • AWS: Outposts
    • Azure Stack
    • セキュリティやネットワークレイテンシ厳しいアプリなどの理由で、結局はオンプレ環境を持たざるを得ない事情があるのだなぁ
  • パブリッククラウドやら、プライベートクラウドやら、ハイブリッドクラウドやら色々あるが、インフラレイヤをさらに抽象化して、いく動き。システムの世界がもう一段、抽象化されてきた印象。アプリを作って、その下のレイヤは 「いい感じによろしく」という世界になっていくはず。

20210912の調べ

分散トレーシング

SAM

20210725の調べ

Log4j 2 performance

Docker logging

Docker Development Environments

Development Environments Preview | Docker Documentation

  • 開発環境を配るのに良さそう。2021/07/25現在、Preview

  • gitのproject指定→自動で、良さそうなイメージが選択されて、VS Codeが上がる というのもできるし、

  • 自前のdocker-compose.yamlを指定してもOK

    • DBとかも一緒に配る場合は、こっちだろうな。
  • docker-composeの場合のサンプルを試してみる

    • 1 git project -> 3 docker containers
      • vs codeでアタッチすると、3コンテナでソースコードは共有されている?
        • 1つのコンテナでソースコードを修正すると、全部、その変更が伝搬される。
        • 同じソースコードが格納されている場所がマウントされている模様

Docker internals

MacのDocker desktopの docker hostはどこ?

20210703の調べ

Lakehouse

  • Data Lakeだと、結局 BIなどの用途で、ETLかましたDWHができる問題あり。
  • 分析、ML系のworkloadで、SQL越しではなく、効率的に直接DataFrameアクセスしたくなるというのは納得
    • Datawarehouseだときついところ(structured data store)
  • Lakehouse
    • コンピュート と データの分離
      • DWHは一体ですからね。 分析系のworkloadは、コンピュートがバラけているから、扱いづらい

Cloud Spanner と CAP

Cloud Spannerとはなんだろう?

分散データベースだけどACIDが実現できるらしい プロダクト? RDB?

Cloud Spannerに対抗する、AWSやAzureのサービスはある?

  • AWSの場合、AuroraとDynamo DBと思われる
    • Aurora
      • auto scale up and down,
      • Spannerの持つ、multi-masterには勝てない?
        • これが必要なのは、ごく少数の超巨大グローバル企業のはずで、ほとんどのユースケースでは変わらないかも
    • Dynamo DB
      • auto scaling
      • multi region, multi-master
      • NoSQL

Spannerの原理、仕組みは?

  • Paxos, 原子時計。難しい

  • CAP定理と関連して

    • 説明だけ見ると、C,A,P同時に満たしている夢のデータベースに見える
  • Cloud Spanner と CAP 定理 | Google Cloud Blogがわかりやすい

  • 確かに。

    1
    CAP 定理の意図は本来、設計者にこのトレードオフを真剣に考えてもらうことにありました。ですが、ここでは 2 つの注意すべきことを挙げます。第 1 に、一貫性や可用性を犠牲にしなければならないのは、実際に分断が起こっている間だけで、その間であっても、それを緩和する方法は多くあるということ。第 2 に、定理には 100% の可用性とありますが、そこで議論すべきなのは、現実的な高可用性の実現に伴うトレードオフについてです。
  • 基本、CAで、分断時はCPシステムである

    1
    2
    はたして Spanner は CAP で定義されているような CA システムなのだろうかと。端的に答えると、技術的には違いますが、実際のところ CA システムだと考えて構いません。
    分断が起きると Spanner は C を選択し、A を犠牲にします。つまり技術的に見ると、Spanner は CP システムなのです。
  • Availabilityを犠牲にしているとはいえ、現実的には無視できるレベル だからOKである。

  • 結局仕組みはよくわからない。

    • Googleの管理するインフラ、NWの中でのみ使えるということ がポイントなのだろう。
    • グローバルに一貫したタイムスタンプを付与する仕組みは?
      • 原子時計?

CAP

  • CAP定理を見直す。“CAPの3つから2つを選ぶ”という説明はミスリーディングだった - Publickey

  • ACID, BASE, CAP

    • 一貫性対可用性の議論の最初のバージョンはACID対BASEというかたちで現れました
    • CAP定理の目的はより広く設計について探索する必要があることを示すことでした
  • そもそも、CPってどういうシステム?

    • Pがわからない。
      • P: the system continues to work in spite of Network failure
      • データベースに対する、cache (e.g. Redis)が該当するっぽい
    • Network failureを許容して、Consistensy を維持ってどういうこと?
      • Network分断の時点で、Consistency保てないのでは?
    • PでRedisがいて、すべてのクライアントが同じデータを見れるから、CPなのかな。
      xxx
  • APは

    • 他ノードへのConsistencyはおいておいて、アクセスできるノードにアクセスしてしまう。(それが、consistentかはおいておいて)→Aの選択
    • Pは?
  • やっぱり、この2つ選ぶというのはミスリーディングである。

  • [Please stop calling databases CP or AP — Martin Kleppmann’s blog](https://martin.kleppmann.com/2015/05/11/please-stop-calling-databases-cp-or-ap.
    html)

    • Pは、犠牲にする・しない という問題じゃない。インターネットは常にこの問題をはらむ

      Partition Tolerance (terribly misnamed) basically means that you’re communicating over an asynchronous network that may delay or drop messages. The internet and all our data centres have this property, so you don’t really have any choice in this matter.

Cloud Spanner使ってみる

20210627の調べ, dumb pipesとAPI GatewayのふりをしたESB

Layered platform teams

このチームモデルは、レイヤでチームを分離するということ。

つまり、

  • フロントエンドはフロントチーム
  • ビジネスロジックは、ビジネスロジックチーム
  • データは、データチーム。

現在、広く知られているのは、やっぱりConway’s Lawということ。
つまり、チームの単位は、Business Capabilityの単位とすべきで、各チームはend-to-endで、別にTechnologyのレイヤを意識せずに、責任を持つべしということ。

これは実体験としても、同意である。

  • チームが増えれば、チーム間のコミュニケーションが増える。依存関係ができて、ほかチームの完成を待つ とか。
  • 分離されてしまって、個々のチーム(特に、目に見えない部分)は、全体としての目的を見失う

ESBs in API Gateway’s clothing

ESBのアプローチに対する懸念あり。Microservice architectureとしては、dumb pipesにしたいのに、pipeにロジックが入り込んでしまうため、疎結合化できないし、ビジネスロジックを持ってしまうことで、ESBもメンテ対象になるし、ESB製品にロックされてしまう。たしかに。

we’re observing a pattern of traditional ESBs rebranding themselves, creating ESBs in API gateway’s clothing that naturally encourage overambitious API gateways

もともとESBとしての製品が、たしかに API Gatewayという服着てるだけで、本質的にはESBであることに変わりはない。実体験とも合致する。
無駄にレイヤを増やして開発物が増えている印象。

API gateways can still act as a useful abstraction for crosscutting concerns, but we believe the smarts should live in the APIs themselves.

これに尽きる。API gatewayは認証・認可、ロギング、セキュリティ系など、共通的なedge functionの役割を担うべきだと思う。

このAPI Gatewayのふりした、ESBが、Overambitious API gateways | Technology Radar | ThoughtWorksと呼ばれている。

any domain smarts should live in applications or services.

concerned about business logic and process orchestration implemented in middleware, especially where it requires expert skills and tooling while creating single points of scaling and control.

API Gateway is essentially a reverse proxy

このMagic QuadrantのFull Lifecycle API Managementの中にも、入っているはずで、製品ベンダの謳い文句にも疑いを持っていきましょうですね。

Overambitious API gateways - Kevin Sookocheffの記事でも書いてあった。
確かに、多くのAPI Gateway製品は、多種多様な変換とか、aggregationというまさにロジックを差別化のポイントとして、売っている。

ESB的なAPI Gatewayは、heavyになってくると、開発のスピードを落とす懸念もある。

  • API Gatewayは位置づけ的に、クライアントに対して、入り口なので、ここがデプロイされないと、アプリケーションが動かない。ボトルネックになり得るため。
  • なので、API Gatewayの更新はできる限り、lightweightにする必要がある。 ビジネスロジックが入り込むと、開発・テスト、デプロイが必要になり、全体の足を引っ張る。

API Compositionの役割をどこで持つかという問いが生まれる。API Gatewayは薄く、reverse proxy/routingに徹するとすると、バックのサービスとなるため、compositionするサービスを持つのが良いのかな。

関連のマイクロサービスアーキテクチャのqueryパターン

Lehman’s laws of software evolution

Lehman’s laws of software evolution - Wikipedia

初めて知った。

20210605の調べ

Anthos

  • Problem, Context

    • 100%クラウド!とはなかなか行かず、クラウドとオンプレを上手く組み合わせる”Hybrid Cloud”を採用せざるを得ないケースが、現実問題として多い
    • Hybrid Cloudの目的
      • データの機密性に応じて使い分ける
      • 高負荷時、クラウドで負荷分散させる
      • など
    • しかし、Hybrid Cloudは当然、構成や運用が複雑になりがち
  • Anthos as a Solution

    • オンプレ、クラウド で統一的にコンテナ管理する仕組みを提供する
      • オンプレはAnthos GKEベースのKubernatesを動かす必要あり
      • クラウド
        • GCPだとGKE
        • AWSだと、Anthos Clusters for AWS
    • Service Mesh (Istio)

分散トランザクション

  • これがわかりやすいね

  • データの整合性

    • 厳密な整合性 vs BASE(結果整合性)
    • 厳密な整合性
      • 2PC, XA(DBの機能で実現)
    • BASEなアプローチ
      • Message Broker
      • transaction発行元サービスがcoordinationする
        • TCC (Try/Confirm/Cancel)
        • State Machineを持つ
    • 補償トランザクション
    • データのリコンサイル

事例

MacでTimemachine用にAPFS Volumeを作り直す

実行前の状態

  • disk4が外付けの3TBストレージ ここの一部に、APFS Volumeを作りたい
    $ diskutil list
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/dev/disk0 (internal):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme 251.0 GB disk0
1: Apple_APFS_ISC ⁨⁩ 524.3 MB disk0s1
2: Apple_APFS ⁨Container disk3⁩ 245.1 GB disk0s2
3: Apple_APFS_Recovery ⁨⁩ 5.4 GB disk0s3

/dev/disk3 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0: APFS Container Scheme - +245.1 GB disk3
Physical Store disk0s2
1: APFS Volume ⁨Macintosh HD⁩ 15.1 GB disk3s1
2: APFS Snapshot ⁨com.apple.os.update-...⁩ 15.1 GB disk3s1s1
3: APFS Volume ⁨Preboot⁩ 303.0 MB disk3s2
4: APFS Volume ⁨Recovery⁩ 1.1 GB disk3s3
5: APFS Volume ⁨Data⁩ 61.8 GB disk3s5
6: APFS Volume ⁨VM⁩ 3.2 GB disk3s6

/dev/disk4 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *3.0 TB disk4
1: EFI ⁨EFI⁩ 209.7 MB disk4s1
2: Apple_APFS ⁨Container disk5⁩ 750.1 GB disk4s2
3: Microsoft Basic Data ⁨ExternalDat⁩ 1.5 TB disk4s3
4: Apple_APFS ⁨Container disk6⁩ 750.1 GB disk4s4

/dev/disk5 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0: APFS Container Scheme - +750.1 GB disk5
Physical Store disk4s2
1: APFS Volume ⁨TimeMachine⁩ 1.2 MB disk5s1

/dev/disk6 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0: APFS Container Scheme - +750.1 GB disk6
Physical Store disk4s4
1: APFS Volume ⁨a⁩ 1.2 MB disk6s1

コマンド

yusuke@yusukenoMacBook-Air–>/Users/yusuke:::
$ diskutil apfs deleteContainer disk4s4
Started APFS operation on disk6
Deleting APFS Container with all of its APFS Volumes
Unmounting Volumes
Unmounting Volume “a” on disk6s1
Deleting Volumes
Deleting Container
Wiping former APFS disks
Switching content types
1 new disk created or changed due to APFS operation
Disk from APFS operation: disk4s4
Finished APFS operation on disk6
Removing disk4s4 from partition map

コマンド実行後

$ diskutil list
/dev/disk0 (internal):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme 251.0 GB disk0
1: Apple_APFS_ISC ⁨⁩ 524.3 MB disk0s1
2: Apple_APFS ⁨Container disk3⁩ 245.1 GB disk0s2
3: Apple_APFS_Recovery ⁨⁩ 5.4 GB disk0s3

/dev/disk3 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0: APFS Container Scheme - +245.1 GB disk3
Physical Store disk0s2
1: APFS Volume ⁨Macintosh HD⁩ 15.1 GB disk3s1
2: APFS Snapshot ⁨com.apple.os.update-…⁩ 15.1 GB disk3s1s1
3: APFS Volume ⁨Preboot⁩ 303.0 MB disk3s2
4: APFS Volume ⁨Recover 1.1 GB disk3s3
5: APFS Volume ⁨Dat 61.8 GB disk3s5
6: APFS Volume ⁨V 3.2 GB disk3s6

/dev/disk4 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *3.0 TB disk4
1: EFI ⁨EF 209.7 MB disk4s1
2: Apple_APFS ⁨Container disk 750.1 GB disk4s2
3: Microsoft Basic Data ⁨ExternalDa 1.5 TB disk4s3
(free space) 750.2 GB -

/dev/disk5 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0: APFS Container Scheme - +750.1 GB disk5
Physical Store disk4s2
1: APFS Volume ⁨TimeMachin 1.2 MB disk5s1

一度、全消し

$ diskutil apfs deleteContainer disk4s2
Started APFS operation on disk5
Deleting APFS Container with all of its APFS Volumes
Unmounting Volumes
Unmounting Volume “TimeMachine” on disk5s1
Deleting Volumes
Deleting Container
Wiping former APFS disks
Switching content types
1 new disk created or changed due to APFS operation
Disk from APFS operation: disk4s2
Finished APFS operation on disk5
Removing disk4s2 from partition map

コマンド実行後

$ diskutil list
/dev/disk0 (internal):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme 251.0 GB disk0
1: Apple_APFS_ISC 524.3 MB disk0s1
2: Apple_APFS ⁨Container disk 245.1 GB disk0s2
3: Apple_APFS_Recovery 5.4 GB disk0s3

/dev/disk3 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0: APFS Container Scheme - +245.1 GB disk3
Physical Store disk0s2
1: APFS Volume ⁨Macintosh H 15.1 GB disk3s1
2: APFS Snapshot ⁨com.apple.os.update-.. 15.1 GB disk3s1s1
3: APFS Volume ⁨Preboo 303.0 MB disk3s2
4: APFS Volume ⁨Recover 1.1 GB disk3s3
5: APFS Volume ⁨Dat 61.9 GB disk3s5
6: APFS Volume ⁨V 3.2 GB disk3s6

/dev/disk4 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *3.0 TB disk4
1: EFI ⁨EF 209.7 MB disk4s1
2: Apple_KFS 750.1 GB disk4s2
3: Microsoft Basic Data ⁨ExternalDa 1.5 TB disk4s3
(free space) 750.2 GB -

/dev/disk5 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0: APFS Container Scheme - +750.1 GB disk5
Physical Store disk4s2

Reference

© 2022 blah blah blah All Rights Reserved.
Theme by hiero