2022.09.07「エンジニアが不動産業界の裏側について語る会」のLT資料です。
▼エンジニアが不動産業界の裏側について語る会 https://connpass.com/event/257082/
大量物件データ差分反映をどう実現しているか株式会社Red Frasco 照屋
View Slide
物件管理システム ポータルサイトDBコンバーター物件データここの話!なんの話?物件画像物件情報入力 ポータルサイトDB物件データ変換追加・更新・削除
どんな課題があったかシステム構成データ変換の実態運用(おまけ)目次
どんな課題があったか
1日2回、30万件のデータを30分以内に処理するプロジェクト開始時の目標物件は増える🦆 回数も増える🦆
分散処理と差分反映工夫しているポイント
システム構成
他社物件管理システム S3ダッシュボード(Redash)Slack BigQueryFTPDatadogTransferFamilyDB分散ポイント!ポータルサイトコンバーターシステム(AWS)Step Functions4.データ登録(Lambda)3.データ変換(ECS)5.結果通知(Lambda)1.物件データ(CSV)のスキャン(Lambda)2.排他処理(Lambda)Event Bridgeシステム構成分散ポイント!分散ポイント!分散ポイント!
分散ポイントS3システム単位でディレクトリを分割店舗単位でディレクトリを分割日付単位でディレクトリを分割Step FunctionsシステムごとにStep Functions自体も複数用意データ変換Step Functionsの並列実行でコンテナを40個同時起動データ登録Step Functionsの並列実行でLambdaを40個同時起動
データ変換の実態
Lambda1.ファイルスキャンS3(内部用)①スキャン ③ステータス保存②ファイル移動連動元からアクセス可能内部からのみアクセス可能排他制御べき等性スキャンしたファイルをDBへ記録し、重複実行されないよう制御したり実行状況を管理こんばS3(外部用) 1.ファイルスキャン 2.データ変換 2-1.NGデータチェック 2-2.差分反映 2-3.物件テーブル更新2-4.データ変換の余談 4.結果通知 3.データ登録DB/システムA /店舗A/yyyymmdd/*.csv /店舗B/yyyymmdd/*.csv /店舗C/yyyymmdd/*.csv /店舗D/yyyymmdd/*.csv ・ ・ ・ ・/Work /システムA /店舗A/yyyymmdd/*.csv /店舗B/yyyymmdd/*.csv /店舗C/yyyymmdd/*.csv /店舗D/yyyymmdd/*.csv ・ ・ ・ ・
こんば 1.ファイルスキャン 2.データ変換 2-1.NGデータチェック 2-2.差分反映 2-3.物件テーブル更新2-4.データ変換の余談 4.結果通知 3.データ登録2.データ変換 データ変換でしたいことS3に配置されたファイルを読み解く異常データの検知差分反映(パフォーマンス向上)データ登録用のSTOREファイルとDELETEファイルを生成新規物件と更新物件のみの一覧をファイル出力STOREファイル削除物件の一覧をファイル出力DELETEファイル
ECSS3(内部用) コンテナの内部(Python)こんば 1.ファイルスキャン 2.データ変換 2-1.NGデータチェック 2-2.差分反映 2-3.物件テーブル更新2-4.データ変換の余談 4.結果通知 3.データ登録並列実行 差分確認トランザクション40並列実行2.データ変換/Work /システムA /店舗A/yyyymmdd/*.csv /店舗B/yyyymmdd/*.csv /店舗C/yyyymmdd/*.csv・・・(スキャンした物件CSVファイル)内部からのみアクセス可能 作業テーブル初期化物件データダウンロードNGデータチェックデータ変換差分反映ポータル登録用Tsvファイル作成物件テーブルの更新1.2.3.4.5.6.7.取得配置RDS ProxyDB物件テーブルと作業テーブルにわけている
更新料が1円?!交通情報がない?!3階の建物なのに部屋は5階?!沿線情報はあるけど、距離や徒歩時間情報がない?!居住中なのに即時入居可?!住所が古い?!こんば 1.ファイルスキャン 2.データ変換 2-1.NGデータチェック 2-2.差分反映 2-3.物件テーブル更新2-4.データ変換の余談 4.結果通知 3.データ登録2-1.NGデータチェック
物件名や部屋番号などの少ない情報を保持したテーブルを検索まずは新規か既存かチェックする物件名+部屋番号+賃料+敷金/礼金+住所情報+沿線情報+構造+画像情報+設備+建物情報+駐車場+フリーレント+入居可能日...etcあらゆる項目を文字列で結合ハッシュ化e56d5123807bdf4d166...(略)既存なら更新か否かをチェックするテーブル2テーブル12-2.差分反映こんば 1.ファイルスキャン 2.データ変換 2-1.NGデータチェック 2-2.差分反映 2-3.物件テーブル更新2-4.データ変換の余談 4.結果通知 3.データ登録
例えば入居可能日が2022/09/08の場合▼9/7に変換を実施→まだ未来日なので「2022/09/08」と出力▼9/8以降に変換を実施→入居可能なので「即時」のように出力こんば 1.ファイルスキャン 2.データ変換 2-1.NGデータチェック 2-2.差分反映 2-3.物件テーブル更新2-4.データ変換の余談 4.結果通知 3.データ登録 なぜ変換後に差分チェックをするのか変換前は同じでも変換後に変わることがある2-2.差分反映
全物件 掲載中物件物件テーブル 作業テーブル変換開始時最後に戻す2-3.物件テーブル更新こんば 1.ファイルスキャン 2.データ変換 2-1.NGデータチェック 2-2.差分反映 2-3.物件テーブル更新2-4.データ変換の余談掲載中物件のみを扱うことでパフォーマンスを保つ 4.結果通知 3.データ登録
こんばある程度実装した後の出来事おや、、データ変換だけで数時間かかりそうだぞ。。for文多いのか?並列処理必要か?プログラム各所で実行時間を計測してデバッグループ内でクラス生成しまくっている凡ミス修正することで大幅に改善結果、ストイックにしなくても変換は数分だった2-4.データ変換の余談 1.ファイルスキャン 2.データ変換 2-1.NGデータチェック 2-2.差分反映 2-3.物件テーブル更新2-4.データ変換の余談 4.結果通知 3.データ登録
LambdaポータルサイトDBS3(内部用)差分反映で出たSTOREファイル差分反映で出たDELETEファイル/TSV/システムA/店舗A/yyyymmdd/*_store.tsv/店舗B/yyyymmdd/*_store.tsv/店舗C/yyyymmdd/*_store.tsv・・/TSV/システムA/店舗A/yyyymmdd/*_delete.tsv/店舗B/yyyymmdd/*_delete.tsv/店舗C/yyyymmdd/*_delete.tsv・・内部からのみアクセス可能追加更新削除参照TSVファイルを読み取りBULK_INSERTBULK_UPDATEBULK_DELETE実行こんば3.データ登録 1.ファイルスキャン 2.データ変換 2-1.NGデータチェック 2-2.差分反映 2-3.物件テーブル更新2-4.データ変換の余談 4.結果通知 3.データ登録並列実行一括処理40並列実行
Step Functions4.データ登録(Lambda)3.データ変換(ECS)5.結果通知(Lambda)1.物件データ(CSV)のスキャン2.排他処理(Lambda)実行対象件数実行対象件数と処理完了件数を比較してSlackに通知Slack通知例4.結果通知こんば 1.ファイルスキャン 2.データ変換 2-1.NGデータチェック 2-2.差分反映 2-3.物件テーブル更新2-4.データ変換の余談[成功]結果: 240/240Aシステムが正常終了しました。[失敗]結果: 239/240失敗店舗: B店舗Aシステムが異常終了しました。 4.結果通知 3.データ登録処理完了件数
運用(おまけ)
運用 - エラーログDatadogStep Functions実行時に出力したログを連携検索やフィルターなどエラーログの調査が容易Slackへ通知
運用 - 物件調査Big Query連携直後の物件CSVを全て保持変換後の登録用TSVを全て保持過去にどんな物件があったかをSQLで検索変換結果の履歴もSQLで検索
運用 - フィードバックダッシュボード(Redash)警告やエラー内容をダッシュボードに反映物件の入稿担当の方へのフィードバックの仕組み
不動産のシステムを1年やって思ったこと
fin