# see: https://github.com/danmayer/coverband/blob/v5.2.5/lib/coverband/configuration.rb#L116-L129# The adjustments here either protect the redis or service from being overloaded# the tradeoff being the delay in when reporting data is available# if running your own redis increasing this number reduces load on the redis CPUdefbackground_reporting_sleep_seconds@background_reporting_sleep_seconds ||= if service?
# default to 10m for serviceCoverband.configuration.coverband_env == "production" ? 600 : 60elsif store.is_a?(Coverband::Adapters::HashRedisStore)
# Default to 5 minutes if using the hash redis store300else60endend
毎年稲を刈る度に新しいライブラリが現れるフロントエンド界隈ですが、最近の DIGGLE のフロントエンドでは従来 ContextAPI で行なっていた React の Global State 管理を見直し、移行先として有力な Recoil と Jotai を比較した上で Jotai を導入することに決定しました。
導入決定の経緯と導入する際の工夫について今回はお話しさせていただきます。
React の Global State 管理に関して
React ではアプリケーションの規模が大きくなるとしばしば Global State を導入することになると思います。
導入理由は、コンポーネントを細分化していくにあたってstate/props のバケツリレーの階層が深くなり可読性が落ちていくためなど様々だと思われますが、
DIGGLE でも例に漏れず可読性向上を目的として Global State を導入して管理を行ってきました。
また、Jotai では大きなオブジェクトを扱う際には focusAtom や splitAtom で分割するなどできます。
Recoil は atom の中に atom が入らないため、オブジェクトを細かく分割した atom を用意していたのですが、Jotai ではそれらをまとめて必要な単位で分割して切り出す形に変更しました。
DIGGLEでは Jotai / ContextAPI の組み合わせを利用することに決定しました。
Jotai はシンプルでわかりやすく可読性とパフォーマンスを両立しながら今後の開発を行なっていけそうです。
基本的には Jotai を用いて Global State 管理を行い、state を使わずに変数のスコープを切って再利用したいものに関しては ContextAPI を利用していこうと思います。
今回は現時点での DIGGLE の環境において最善と思われる Global State 管理を検討したものになっており、結論は時期/環境によって大きく左右されると思います。
そのため Jotai は素晴らしいライブラリとは思うものの今回の決定に囚われることなく、その時々の状況に応じて適宜方針を検討し直していきたいと考えています。
今回は DIGGLE において Global State 管理を Jotai に決めた経緯を紹介させていただきました。
本記事が皆様の検討の際の一助になれば幸いです。
usestd::time;
usestd::sync::Arc;
usedatafusion::prelude::*;
usedatafusion::arrow::record_batch::RecordBatch;
#[tokio::main]
async fnmain() ->datafusion::error::Result<()> {
let now =time::Instant::now();
let ctx =SessionContext::new();
let path ="test.parquet";
// 集計用クエリの定義: SQL形式で記述可能let opts =ParquetReadOptions::default();
ctx.register_parquet("facts", &path, opts).await?;
let df = ctx.sql("SELECT date, account_id, unit_id, sum(value) FROM facts GROUP BY date, account_id, unit_id").await?;
// collect() の実行で実際にクエリがexecuteされるlet results: Vec<RecordBatch>= df.clone().collect().await?;
let time = now.elapsed();
println!("time: {:?}, result size: {}", time, df.count().await?);
Ok(())
}
usepolars::prelude::*;
usestd::time;
#[tokio::main]
async fnmain() {
let now =time::Instant::now();
let df =LazyFrame::scan_parquet("test.parquet", Default::default()).unwrap();
let df = df.groupby(["date", "account_id", "unit_id"])
.agg([col("value").sum()])
.collect()
.unwrap();
let time = now.elapsed();
println!("time: {:?}, result size: {}", time, df);
}