https://twitter.com/nekora2199/ に書き込んでいるのはJMSサーバ(ActiveMQ)で、キューで受けたメッセージを適当な間隔を置いてTweetする。アフィサイト更新プログラムやTV番組自動実況プログラム等々、様々な処理が好き勝手なタイミングでメッセージを発してもTwitterサーバに一気にアクセスに行ったりしない為だ。
JMSクライアント側も実はマルチスレッドなので、JMSサーバとの接続はプーリングしている。これまで特に問題無かったんだけど、お正月にTOKYOMX、狂気のミルホ13時間一挙放送を、私に代わって実況させた時に問題発生。JMSサーバ側が一回OOMで落ちて*1再起動したものだから、プーリングしていたコネクションが皆死に、以後のメッセージ送信が全滅。手を抜いて死んだコネクションをプールから破棄するタイミングを作っていなかったので。
さて、一体何時接続チェックすべきか。確かWebLogicのJDBCコネクションなどは、デフォルトだと120秒ごとにチェックしているんだが、Oracleというか今は亡きBEAが言うベストプラクティスだと、この一定時間毎のチェックは無効化して、アプリがプールから予約する時に接続チェックするオプションを有効にする。確実性優先。
まぁデータベースとJMSキューでは全然違うが、ベストプラクティスのやつに合わせるか…。そうすると異常検出が実行時になってしまうからこの場で再接続せねばならぬ…。どれくらいの間隔で何回リトライするか…。
コメント