📕

バックエンドアプリを10年間 問題なく稼働させること

3 min read

アプリ開発依頼

2010年の9月にTCP/IPを使ったサーバーサイドのバックエンドアプリを開発する依頼があった。

プロジェクトに入る前にLinuxでTCP/IP通信が絡む案件だとだけ聞いていた。
どう作れば良いか... できることなら完璧なものを作っておきたい。

参考資料あつめ

ネットか書籍に頼る。
以前、Solarisで開発をやっていた時に
「UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI」
「UNIXネットワークプログラミング〈Vol.2〉IPC:プロセス間通信」
「C for UNIX」著)小俣光之
という関係しそうな本をいくつか持っていたが...

参考に... ならない全部Unix本である、今回はLinux 似て非なるもの。
何か探さないとということで、小俣光之さんをネット検索した。
「C for Linux 実践Linuxシステムプログラミング」
「C for Linux2超実践Linuxネットワークプログラミング」
の2冊がAmazonの中古本であった。

内容が今度の案件に合致しているかどうか「なか見」したいが中古本しかなかったのでとりあえず購入した。
2010年9月17日に注文した。
プロジェクト開始は2010年10月から開始なので始まる前に作業に対する意識が強いということである。
本当にプロジェクトを成功したいと考えるエンジニアならこのぐらいの気持ちで挑まなければいけないと思っている(持論)。
注文から2~3日以内に書籍が到着したネットワーク関係の記載もあるのだが、Linuxシステムの基本も載っている。
既に持っていた「C for UNIX」をLinux版にして更に通信プログラムが詳細に追加されているような感じだ。
ざーっと斜め読みして直ぐに分かった、良書だ!

プロジェクト開始

2010年10月になってプロジェクトが始まった。
そして案件の詳細を聞いた。
Linuxサーバ環境でサービス提供会社からサービスに接続するための接続用APIが提供されている。
そのAPIはC言語で作成されライブラリとして提供されている。
これを既存のJavaコンテナで作成されたアプリケーションから使用したいという案件だった。
JavaからC言語ライブラリを使用するには2つくらい案がある。

1.Javaのネイティブインターフェース(JNI)を使用して直接的にAPIを呼出して使用する方法
2.C言語でAPIを使用するアプリを作成してJavaとTCP通信を介して接続する方法

発注元がC言語がちょっと(難しい、困難、要員がアサインできない)ということで依頼があったわけで
C言語はソフトウエア開発をやるなら最初の一歩ぐらいで始めるというのが既に常識ではないのだなと感じた次第。
Linuxという後発のOSなのでCPUやOSの環境に依存するC言語は過去の知識が通じない場合があるが基本は同じだ。
発注元の依頼で私を含めてC言語開発要員で2~4名でプロジェクトに入り込んだ。
通信プログラムなのでマルチスレッドは必須、そこでいっしょにきたメンバにC言語でマルチスレッドは得意か?と聞いてみた。
他のメンバは皆首を横に振った。
そこで決めた「私、独りで作ろう」。
ディフェンダーを蹴散らしながらドリブルで持ち込んでゴールする気持ちと同じ。

先の2つの案のどちらでいくか決定しなければならない
JNIか?TCP通信か?
マルチスレッドが絡んでいるのでJNIは後でうまく制御がいかなくなったときに苦労すると思ったので
TCP/IP通信がいいよというか、発注元の担当につぶやきながらそちらに誘導した。

開発着手

方式を決めたのは良いのだが、Linuxでの通信プログラムで基本24時間365日連続稼働かつ万が一、TCP接続が切断された場合でも
再接続を待ちの状態にしておく必要がある。
そこで自分の知識と「C for Linux2超実践Linuxネットワークプログラミング」の出番である。
今回はC言語の部分に加えてJava側も作らなければいけない。
最初から一緒にきたメンバを蹴散らすわけにはいかないのでそれっぽくJavaのほうやったらいいよみたいな感じで追いやっていった。
オフサイドトラップの裏をとるみたいな感じだ。
プログラムのデザインはC言語とJavaのTCP通信があるのでJava側の通信部分も設計していて
それを他のメンバにハイって渡して終わり(終わりにならなかったけど...Java側にも結構かかわった)。

通信方式や電文フォーマットの記載のあるAPIの設計書を熟読してC言語とJavaの通信制御も考えて
プログラムのデザインは10月4日の週でできたと記憶している。
10月11日の週はコーディングしていてふと気づいた
APIの動的ライブラリってどうやってリンクするんだっけ?そう、基本的なことをいくつか分からない。
でもネットの情報で解決した。
Makefileの作成方法をサンプルをつけて丁寧に解説している方がいらして助かった。
そして、10月21日にはログ出力なのは簡単にしか作っていないがC言語の通信アプリができあがった。
Javaの部分は書籍を参考にTCP通信、提供会社との接続はAPIのライブラリでTCP通信。
通信アプリはJavaと提供会社の中継を担う役割をする。
なので決して死んではならない(まぁ、どこも死んではならないのだがw)。

着手したと思ったら完成

開発スピードはひとりでやると速度があがる。
これが複数人で開発するとグーンと遅くなる。もし多人数でやっていたら11月になっても完了していないかも...
大体、スケジュールは12月末までに単体テスト完了なのである程度速度感をもってやらないといけない。

提供会社のサーバにつなげるためにC言語の通信アプリだけではダメで、Javaの部分にあたる部分が必要である。
実は、このJavaの部分にあたる部分もC言語でサッと作った。
世にいうドライバというものにあたる。

ドライバ、C言語の通信プログラムでサーバに接続してみた。
直ぐにつながった、ログインしてデータ要求してデータを受信できた。

終わった。約20日の戦いでした。
人間、集中できると結構な能力を発揮できる。

後は通信が切断した場合の処理部分をもう少し完璧にするのとログ出力をもう少し良くすることだけ。
そして、後はテストを実施して完了。
テストも11月の中頃に終わったと記憶している。

時は流れて

そして、現在(2021年9月)、実稼働約10年プログラムの修正もなく今日も元気に通信の中継処理をこなしていましたが、システムの運用が変わり作成した通信アプリは使用を今月をもって終了することになりました。
10年間稼働したのは結果となりますが、製造直後はこんなに長い期間稼働するとは思っていませんでしたが...w

Discussion

ログインするとコメントできます