1954

Thoughts, stories and ideas.

Kafka compatible streaming solutions, July 2024

A curated list of streaming solutions that supports Apache Kafka protocol. Solutions which just hosts Apache Kafka are not listed. (e.g. MSK) name company source code WarpStream WarpStream N/A Redpanda Redpanda Data Inc. https://github.com…

End-to-end encryption in Apache Pulsar

Apache Pulsarはe2e暗号化をビルトインで備えている。 pulsar.apache.org これは以下のように動作する。 まず公開鍵ペアを事前に生成しておき、Producerに公開鍵、Consumerに秘密鍵を設定する。 Producerはmessage暗号化用のsession key(共通鍵)を生成し、そ…

Tunneling Kafka protocol over HTTP

Apache Kafkaにおいて、client <-> server (broker)間の通信は独自のwire protocolで行う。 ここで、brokerとclientが別のネットワークにあってHTTPでの通信しか許可されていないシナリオを考える。 HTTP上で任意のTCP protocolをtunnelingするのは一般的な…

KafkaStreams outer join semantics change in 3.1.0

Before 3.1.0, KafkaStream's stream-to-stream outer join used to produce a bit counterintuitive output. When we have stream s1, s2 with 10 seconds window, s1.leftJoin(s2) produces below output before 3.1.0: refs: kstream-kstream-join in 3.0…

Access raw clipboard PNG image data in Electron (macOS)

Electron provides the API to get clipboard data via clipboard.readImage. However, I found it doesn't preserve original image info so some information may drop. Notably, pHYs metadata in PNG. The problem arises when we take a screenshot in …

Incremental Fetch Requests in Kafka

Incremental Fetch Requests introduced in Kafka 1.1.0 is a mechanism to reduce Fetch overhead (especially when a client is interested in many partitions e.g. ReplicaFetchers) cwiki.apache.org Before KIP-227, all topic partitions had to be e…

Use of MappedByteBuffer could cause long STW due to TTSP (time to safepoint)

In JVM, "safepoint" is a point that all threads are suspended so we can get the consistent view of the thread states. openjdk.org JVM executes operations that needs to be done inside safepoint (e.g. thread dump) in below procedure: 1 Call …

Kafka consumer's cooperative rebalancing explained

Introduction Kafkaにおいて、同一のgroup.idを持つKafka consumerの集合をconsumer groupと呼び、各groupは特定のtopicをsubscribeする。 group内の各consumer(memberと呼ぶ)にはtopicのpartitionが分散して割り当てられ、それぞれ割り当てられたpartitio…

VRoid studioでpresetの服の色を変える

Environment VRoid Studio version: 1.13.0(正式版) How to このpresetの服の色を赤っぽく変えたいとします まず、Edit textureでテクスチャの編集画面を開きます まず服のテクスチャ画像をpngにexportします 上記のscreenshotでは「デフォルト画像」を右…

Introducing literate-intellij-plugin

Background TLA+のツールセットにはSpecをLaTeXドキュメントとして出力する機能があります。 Example: 最近、この機能を拙作のTLA+ intellij pluginにintegrateできないか考えていました。 公式のTLA+ toolboxやVS Code pluginにはintegrateされていてSpecを…

Introducing TLA+ Intellij plugin

Motivation Nowadays, it's getting popular to use formal methods to verify complex systems e.g. distributed storages. TLA+ is a widely-adopted formal specification language created by Leslie Lamport. The standard way to write and verify TLA…

Does Kafka bootstrap server have biased connections from clients?

Kafka clientは以下のようなフローでbrokerに接続します。 まずbootstrap.serversに指定されたいずれかのbrokerに接続し、metadata(partitionのleader)を得る partitionのleaderに対してconnectionを開く produce/consumeを開始する 最初に最低1台に繋げれ…

Thoughts about oslo.messaging Kafka driver

(OpenStackについては素人なので間違ったことをいろいろ書いてるかもしれない) OpenStackはクラウド環境を構築するためのオープンソースプロジェクトで、VMなどユーザー向けの計算資源を管理するサービス(Nova)や認証を提供するサービス(Keystone)etc…

A pitfall in Kafka partition splitting when auto.offset.reset = latest

Kafka 2.7.0現在、consumerのauto.offset.reset configはlatestがデフォルトとなっています。 これは、consumer groupがあるpartitionをsubscribeするとき、commit済みoffsetが存在しない場合(consumerの初回デプロイ時や、offsets.retention.minutes以上の…

histogram_quantileはどのようにquantileを計算しているか

Prometheusには、quantileを計測する方法としてSummaryとHistogramの2種類があります。 prometheus.io 上記公式documentに記載がある通り、Summaryはclient sideでquantileを計測するのに対し、Histogramではprometheus sideでqueryを打つ際にアドホックに算…

KIP-392 Follower fetchingによるfetch requestの増加について

Kafka 2.4.0でfollower fetchingと呼ばれる機能が入りました。 cwiki.apache.org これにより、consumerはleader replicaのみではなくfollower replicaからデータを読み出すことが可能となります。 Follower fetchingは、たとえばデータセンターをまたいでrep…

Arduinoで電子オーボエを作る

はじめに 3月の終わりに、響け!ユーフォニアム1期〜2期, リズと青い鳥, 誓いのフィナーレを一気見して「特別になりたい」気持ちを再確認し、オーボエを始めようと思い立ちました。 「昨今みんな在宅環境に投資してるし、いいイス買うようなものだし」と謎の…

Gradle maven-publish pluginでSonatype OSSRHにlibraryをpublishする

Gradleでmaven repositoryにlibraryを上げる場合、maven pluginとmaven-publish pluginの二つの選択肢がある。 以前はmaven-publishがsigningをサポートしてなかったりでmaven pluginを使うケースが多かったようだが、現在はすでにstableになっている。 docs…

RedisのHyperLogLogの誤差について

HyperLogLogは集合のcardinalityを近似する確率的アルゴリズムです。 RedisにもPFxxxというcommandで実装されており、標準誤差は0.81%です。 The returned cardinality of the observed set is not exact, but approximated with a standard error of 0.81%.…

2018年の振り返り

登壇 LINE関連をメインに、いくつかのイベントで登壇の機会がありました。 sbt-uglifier ScalaMatsuri 2018の懇親会「オプテピピック」でのLTです。 LINE NEWS の広告配信を支える LINE DMP の裏側 LINE Developer Meetup #37「ニュースメディアにおける広告…

複数サーバーでtail -fっぽく読むJavaライブラリtailer7

tailer7というJavaライブラリを公開しました。 github.com これを使うと、たとえばcommons-io Tailerでログをtail -fしつつtailer7のLogSenderに投げれば、複数サーバーでLogTailerを立ち上げてstreamingでログを受け取れます。 アイデアについてはこの記事…

ISUCON8本選に出場して5位だった

Webアプリケーションの高速化バトルISUCON8本選に「チーム人間性」で出場しました。 最終スコアは13,914で5位という結果に終わりましたが、素晴らしい運営と問題で、大変楽しいコンテストでした。 使用言語はGoでした。 やったこと 3人チームで参加し、自分…

redshift-fake-driverでAmazon Redshiftをモックする

Amazon Redshiftは便利でコスパのよいDWHですが、時間に対する従量課金なので、ちょっとした動作確認のために立ち上げっぱなしにしとくのが気がひける場合もあります。 もしJVMプロジェクトを開発しているなら、redshift-fake-driverを使うことでRedshiftを…

Redis cluster + lettuceでmget/msetすると複数リクエスト飛ぶ

Redis clusterに対してmget/msetしたとき、slotが異なるものが混在しているとCROSSSLOT errorが返ります。 したがってhash tagを用いてslotを指定するか、まとめたい単位でhash型のvalueに突っ込むなどのkey設計にする必要があります。 Redis Cluster Specif…

goofysを使ってS3以外のストレージをfstabでマウントする

goofysはAmazon S3またはAPI互換なストレージをfile systemとしてマウントできるツールです。 github.com 起動時に自動的にマウントするにはREADMEにあるように/etc/fstabへ追記すればよいですが、S3以外のストレージを使う場合は、以下のようにendpointを指…

AIKATSU! STREAMというChrome extensionを作った

生産性をあげるため、アイカツ!のライブシーンを延々と再生し続けるAIKATSU! STREAMというChrome extensionを作りました。 (dアニメストアへのログインが必要です) chrome.google.com とはいえ、jsで動画を解析してライブシーンを抜き出すようなことをし…

2017年の振り返り

1-3月 広告効果測定ツールADPLANのリリース 自分は集計周りをメインで担当してましたが、無事にリリースすることができました。 ScalaMatsuri 2017登壇 Introduction to ScalikeJDBCというタイトルで喋りました。 4-6月 #bq_sushi tokyo #5 @ Google Cloud C…

JavaとしてもScalaとしてもコンパイルできるHelloWorld

タイトルの通り、以下のコードはJavaとしてもScalaとしてもコンパイルできます。 /*/**/ class JavaMain { public static void main(String args[]) { System.out.println("Hello, World"); } } // */ /*/**/ class App {} // */ /*/**/ class A { int objec…

Ammonite REPLで任意のclasspathを追加する

MavenやGradleプロジェクトでも、sbtみたいに手軽にREPLで動作確認したいときがあります。 お手元の開発環境にAmmonite REPLを入れておけば、以下のようにScalaを使って動作確認できるので便利。 $ amm Loading... Welcome to the Ammonite Repl 1.0.2 (Scal…

アイカツ!の曲のかっこよさについて

この記事はアイカツ! Advent Calendar 2017の25日目の記事です。 はじめに 女児向けアーケードゲームやアニメには、そのターゲット層とは裏腹に、コアな音楽ファンをも虜にするような楽曲を繰り出してくる作品が少なくありません。 とりわけアイカツ!は、…