Curl言語での Http通信で、timeout 時間を無理やり設定した話

Curl言語のHTTP同期通信では、タイムアウトをロジック側で指定することができません。仕方がないので回避策として取った方法についてつらつらと書いていきたいと思います。

こんにちは。はると申します。
WordやExcelとの格闘に四苦八苦。
あれ?私コード書く人間じゃなかったっけ?とか時々遠い目をすることが多くなってきたぺーぺーエンジニアです。

そんな中最近起きたトラブルとその対処について、つらつらと書いていきたいと思います。

 

状況説明

私どもが開発をしているアプリの一つは、Curlという言語でフロントが組み立てられています。
Curlとは、リッチクライアントアプリ(RIA)を構築できる言語の一つ。
httpを通じてブラウザ内や、独立したアプリケーションと同じような形で起動できるアプリを作ることができる言語です。

作り込めばかなり細かい挙動を指定したアプリを作ることは出来るのですが、いかんせん主流になれなかった言語の悲しさ。Curl使いなエンジニアは数少ないと思われます。

問題発生「画面が突然固まるんだけど!!」

そんな中、とある問題が発生しました。
アプリの中で、画面から外部のAPIに接続して情報を取得する処理があるのですが、稀にデータを取得中に動作が固まるという報告を受けたのです。
どうやら、外部のサーバーが接続は受け入れるものの、そのままサーバーがBusyになり、データリターンがない状態のままになってしまうようです。
この部分の通信処理は同期処理で書かれていたこともあり、相手先からの返答を待って次の処理を実施します。
それが、外部サーバーが何も戻さないものだから、反応できなくなってしまったんでしょうね。困ったものです。

原因調査「あれ?Curlの通信って。。。」

って言うわけで、対処に当たったわけですが。。
「返答がなかったら接続切っちゃえばいいだろ(Java脳)」とか思っていたわけです。
とりあえず、通信実行APIをヘルプで確認してみましょう。

。。。。あれ?タイムアウトなんてないじゃん??この時点で軽く狼狽です。

その後いろいろ調べてみたのですが、通信系のAPIでTimeoutの設定ができるのは、TCP/IPレベルの通信ができるAPIのみでした。流石に独自でHTTPをしゃべるクラスを作る気にはなれません。

対策

と言う訳で、苦肉の策としてある方法により対処を行いました。
ここの部分の通信処理だけ非同期通信にして、外部タイマーにより自動キャンセルを行うように変更し、とりあえず擬似的なTimeoutをするようにしたのです。

Curlのヘルプページに非同期通信のサンプルがありますので、それを変更してみましょう。
リンクはこちらから → 非同期ストリーム入出力

Timerクラスの中の delay というプロパティに対して、10s(10秒)の設定を行いました。
ボタン押下した際のイベントの中に、tmというタイマーインスタンスを生成。
これに時間管理をさせて、時間が来たら自動でキャンセルをしてもらうようにしました。
非常に簡易的な対処ではありましたが、これの方法でどうにか現象を回避することができました。

ただ、元々が同期処理で書かれていたものを非同期にしたため、接続からデータ構造体へのパースを行う処理を別立てにしてイベントの中に放り込むなどの調整が必要でした。
最近Node.jsを触ったときにも思ったのですが、非同期処理はとにかくインデントが横に伸びがちです。上手いことメソッドを分けて、見づらいコードにならないように気をつけましたね

(まぁこれは他の言語にも共通して言えることですけど。。)

では今回はこれにて!

この記事が気に入ったら
いいね ! しよう

Twitter で
The following two tabs change content below.
サイト管理者
サイト管理者
株式会社ギークフィードのサイト編集担当者です。 弊社へのお問い合わせ・質問は、お問い合わせページからお願いいたします。

【採用情報】一緒に働く仲間を募集しています

採用情報
ページトップへ