気象庁XML取得API
７年間の運用のまとめ その２
2020年10月1日
先端IT活用推進コンソーシアム
クラウド・テクノロジー活用部会 上村準也

Copyright © 2020 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

７年間の運用のまとめ その２
REST API の中の人が、ふりかえりとネタばらし
1.
2.
3.
4.

作り始めた頃に考えていたこと
JSON形式のデータはどうやって作っているの？
なぜ大雨危険度通知を利用できないの？
運用を終える今に考えていること

Copyright © 2020 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

2

作り始めた頃に考えていたこと• PostgreSQL でXML型が使えるのを試したい
作り物でなく本物のデータを扱う方が面白い– 後にJSONも扱うようになるのも同じ理由• 実際にデータを活用したサービスを作るのに生データをブラウズできるものがあれば捗る

Copyright © 2020 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

3

JSON形式のデータの作り方• http://api.aitc.jp/jmardb-api/help
ここにある記載のものです

Copyright © 2020 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

4

JSON形式のデータの作り方
こちらに貼っておきました
https://gist.github.com/5d284a4d2b3755d3962
b9eba7e6c882f• １００行くらいのJavaで、JAXBとJSONICというライブラリを使用しています

Copyright © 2020 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

5

JSON形式のデータの作り方

Copyright © 2020 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

6

JSON形式のデータの作り方

Copyright © 2020 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

7

JSON形式のデータの作り方

Copyright © 2020 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

8

JSON形式のデータの作り方• PostgreSQLの xslt_process() 関数を利用してSQL文でXMLスタイルシートを呼んで変換もできたのですが…
– 気象防災情報の種類が多すぎる– スタイルシートを記述しようとしてもどうしても頭が追い付かない

Copyright © 2020 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

9

JSON形式データの作り方
ちなみに REST API で JSON の指定部分を切り出す機能は PostgreSQLの json_extract_path() 関数で作られています
SELECT json_extract_path(report_json, VARIADIC ?) FROM reports WHERE id = ?

Copyright © 2020 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

10

大雨危険度通知がない理由

Copyright © 2020 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

11

大雨危険度通知がない理由
テーブルにINSERTできないから！
< 2019-07-13 06:02:22.714 JST >ERROR: index row requires 33240 bytes, maximum size is 8191
< 2019-07-13 06:02:22.714 JST >STATEMENT: INSERT INTO reports (id, report, received) VALUES($1, $2, CURRENT_TIMESTAMP)

Copyright © 2020 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

12

大雨危険度通知がない理由

これまで紆余曲折を経て20個近いインデックスが定義されていて…
"reports_pkey" PRIMARY KEY, btree (id)"report_areacode" gin ((xpath('//basis:Area/basis:Code/text()'::text, report,
ARRAY[ARRAY['basis'::text, 'http://xml.kishou.go.jp/jmaxml1/informationBasis1/'::text]])::text[]))"report_areacode_mete" gin ((xpath('//mete:Area/mete:Code/text()'::text, report,
ARRAY[ARRAY['mete'::text,'http://xml.kishou.go.jp/jmaxml1/body/meteorology1/'::text]])::text[]))"report_areaname" gin ((xpath('//basis:Area/basis:Name/text()'::text, report,
ARRAY[ARRAY['basis'::text, 'http://xml.kishou.go.jp/jmaxml1/informationBasis1/'::text]])::text[]))"report_areaname_mete" gin ((xpath('//mete:Area/mete:Name/text()'::text, report,
ARRAY[ARRAY['mete'::text,'http://xml.kishou.go.jp/jmaxml1/body/meteorology1/'::text]])::text[]))以下略
Copyright © 2020 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

13

大雨危険度通知がない理由• 大雨危険度通知に大量のAreaが含まれる
そのためインデックスの最大サイズを超える• いくつかインデックスを廃止してみたが、他の情報の検索にも影響するため断念• データのハッシュ値をインデックスする手法もあるらしいが、それでも超えそう
Copyright © 2020 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

14

今、考えていること• 作り始めた頃に考えていたことに影響されて特化しなさすぎるのも、しんどい– すべての種類の情報をテーブル１つで– PostgreSQLの機能で解決する– 種類が増えたりしても呑み込めるはずだったが…

• 実際のサービスを作る時は、目的に合わせてきちんと設計できると良いなあ…
Copyright © 2020 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

15

今、考えていること• 特に気にかかるのはエリアに関して– どの目的のサービスでも速度のネックになりそう– ときどき更新されるので、どう追従するか…

Copyright © 2020 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

16

REST API に関してはここまでです

Copyright © 2020 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

17