質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

2回答

1568閲覧

Windowsアプリ 冗長化(二重化)手法につきまして

Sitapper

総合スコア26

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

1クリップ

投稿2021/04/09 00:34

同じLAN上の2台のPCに同じアプリを導入して起動しておき、
一方がサービス中の際には他方は待機し、
一方のサービスが停止されたりアプリが終了されると他方がサービスを開始する、
というような二重化を実現しようと思います。

この場合、別端末にあるプロセス同士が何らかの方法を用い、
相手の状態を知る/こちらの状態を知らせることになるかと思いますが、
どのようにするものでしょうか?

例えば、どちらからも参照できる共有フォルダとその中にファイルを用意して、
定期的にサービス側での更新・待機側での参照をし、その中身やアクセス成否で判断する、
というやり方もできるのでしょうが、恐らく普通はそのような方法は採らない気がします。
代わりに何かプロセス間通信のような手段にするのではないかと思うのですが、
もう少し具体的に、こういう方法で、というのが有れば教えていただきたいです。
裏技的なやり方や、なるべく簡単なやり方で、というよりは、
普通というか、素直というか、一般的とういか、そういう方法を知りたいです。

ターゲットPCはWindows7以降を想定していて、
アプリはC#(.NETFramework 4.7.2)で作成するフォームアプリケーションです。

ターゲットPCには作成したアプリ一式(と.NETFramework)の導入と、
(必要であれば)共有フォルダの設定は可能ですが、
Windowsの機能の追加や、その他のWindowsの深い設定の変更等は避けたいです。

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/09 08:25

何のための冗長化でしょうか? 普通に考えると、上流にローダバランサでも置いて、サービス監視を実施するのが楽な気がします。
Sitapper

2021/04/09 08:50

ご回答ありがとうございます。 まだうまく説明できていないのかも知れません。 何のためかというと、別の端末でそれぞれ起動されている同じプログラムで、 一方が仕事をしている状態でなくなれば他方が引き継いで仕事を行うということをしたいわけです。 すみません。初心者なので、 上流のローダバランサの具体例が今一つ分からなくて申し訳ないのですが、 上記の例では、LAN上あるのは端末A,Bのみであって、 それぞれのXが互いの状態を把握できるようなプログラムにすれば良いと思っています。
退会済みユーザー

退会済みユーザー

2021/04/09 08:57

すみません。ロードバランサです^^; 外部からサービスにアクセスするために冗長構成をとるのかと思ったのですけど、違うようですね。 外部アクセスがない状態で、サービス提供が継続されていなければならない状態というのがよくわからないです。 どのような処理がなされているのでしょうか?差し支えなければ。
Sitapper

2021/04/09 13:18

お返事が遅れましてすみません。 質問の例が簡略化し過ぎていて何のための二重化か分からなくなっていたかも知れません。 gentaroさんのコメントに返信させていただいたように、 工場のラインを監視する機械からのデータの受信・加工を行うプログラムを作っていますが、 これを動かすためのPCが1台だと故障等があると処理が止まってしまうので、 そのリスクを少しでも下げるためもう一台用意して二重化しようという発想でした。 このような用途の場合、もしかすると、このプログラムに二重化の仕組みを取り入れるのでなく、 そもそも全く別の方策が取れる・取るべきという知識をお持ちの方もおられるかも知れませんが、 とりあえずここではこのプログラムでの二重化を考える、と言う趣旨で質問させていただきました。
guest

回答2

0

解決済みですが。

前提条件がよくわかりません。切り替え時間はどれくらいまで許容されるのか?クライアント側のアプリケーションも自作できるのか?等

**単にクライアントアプリケーション側に複数のサーバアドレスを組み込んでおく(優先サーバに接続できなければ別サーバに接続する)**だけでもある程度対応できると思いますよ。細かい条件次第ですが。

投稿2021/04/12 00:51

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

最初に「サービス」とか書かれている割にWindowsFormsアプリケーションとか書かれていて、Windowsサービスですらないフォームアプリケーションで冗長化、ってのがまず普通じゃない気がするけど…。

素直にやるならTCP/IPで通信できる何らかの手法を使って死活監視すればいいだけだ仮定すると、単純なHTTPでのポーリングでもWebSocketでもgRPCでも何でも良いんじゃないですか。

その「サービス」(なのかフォームアプリケーションなのか知らんけど)が生きていれば応答返せば要件満たせるはずなんで、ping/pongの機能をお好きなプロトコルで実装してください。

投稿2021/04/09 03:56

gentaro

総合スコア8947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Sitapper

2021/04/09 04:14

ご回答をありがとうございます。 ここで言うサービスとは例えばWindowsのタスクマネージャで表示される所謂Windowsサービスではなくて、 単純にそのアプリケーションが提供している機能が動作をしているという意味のことでした。 特に何も考えずにそう表現しましたが、運転中か何かにすれば誤解もなかったでしょうかね。 すみません。 いろんなやり方があって、確かに好きなプロトコルを使えばいいのでしょうが、 何ぶんこのような機能を実装するのが初めてだったものですから調べてみますと、 WCFとかいうのもあったりして(これが当用途に相応しいかどうかまでは調べきれていませんが)、 普通はこういう方法でやるよね、みたいなものがあるのであれば、 それについて勉強といいますか、知識を得ようと思って質問させていただいた次第でした。 ありがとうございました。
Sitapper

2021/04/09 04:22

すみません。訂正です。 誤)タスクマネージャで表示される所謂Windowsサービス 正)タスクマネージャの「サービス」タブで表示される所謂Windowsサービス
退会済みユーザー

退会済みユーザー

2021/04/09 06:17

横レス失礼します。 あなたの言う「フォームアプリケーション」がそこに表示されるのでしょうか? Windows Forms アプリのことであればそこには表示されないはずですし、そもそも Windows Forms アプリは冗長化を考える必要もないと思うのですが。そのあたりをよく考える必要がありそうな気がします。
Sitapper

2021/04/09 08:16

ご回答ありがとうございます。 「サービス」にせよ「フォームアプリケーション」にせよ、私の言葉選びが悪いのでしょうか。 すみません。 やりたいことは以下のようなものです。 同じLAN上に端末Aと端末Bがありまして、同じプログラム X.exe が導入されています。 このプログラムには起動している間、運転中、待機中、停止中の3つの状態があり、 このうち運転中の状態の時のみ何がしかの仕事を行います。 まずAが先に起動されると、AのXが自動起動され、かつ自動で運転中になります。 続いてBが起動されると、BのXも自動起動されますが、AのXが既に運転中なので、待機中になります。 その後、 a) AのXの停止(手動で運転を止め停止状態にできます。X.exe自体は生きていますが何もしません。) b) AのXの終了(X.exeが終了された場合です。端末Aの電源断も含みます。) のいずれかをBのXが検知すると、待機中から運転中に自動で移行したいのです。 そのためにBのXは、AのXが起動しているかしていないのか、 起動しているのなら、運転中なのか停止中なのか、を知りたいです。 質問の意図は、この方法として何かよく使われるものでもあればというものでした。 分かりにくかったらすみません。 因みにですが、この例では、BのXが運転中となった後、 a) 停止中だったAのXが手動で運転にされた b) 終了していたAのXが起動された のいずれの場合も、BのXが運転中なので、AのXは待機中になります。
dodox86

2021/04/09 08:52

質問者Sitapperさんの[2021/04/09 13:14]の本欄のコメントより: > 何ぶんこのような機能を実装するのが初めてだったものですから調べてみますと、 > WCFとかいうのもあったりして(これが当用途に相応しいかどうかまでは調べきれていませんが)、 > 普通はこういう方法でやるよね、みたいなものがあるのであれば、 同じアプリを複数のマシンに導入して相互に監視し合うという形態が無いとは言いませんが、アプリ単体ではそれほど一般的ではないので、それに対する「普通の方法」は特に存在しないと思います。堅牢にやるのであれば何らかの監視用ソフトと併用し、監視ソフトで監視し得る動きを監視し、必要に応じてアラームやアプリの再起動をします。そういったものを導入せず、製品の要求仕様に応じてオリジナルのアプリに導入するのであれば、本回答でいただいたように何らかの通信で所定のデータをやり取りするよう自分で好きに実装するしかありません。WCFはWindows上で使える通信関係の機能を言わばラップして高度に使えるようにしたものなので、恐らく過剰スペックだと思います。
gentaro

2021/04/09 09:07

dodox86さんのコメントにある通り、フォームアプリ単体での相互監視という要件であれば「普通」じゃないので「普通の方法」は存在しません。 「死活監視」という機能そのものは普通のものだけど、実装方法は回答したとおりTCP/IP上で動作するプロトコルの中で自分の都合に一番合うものを使うのが「普通」と言えるかもしれませんが、「誰でも万人にとって普通」なんて解は存在しません。 なおWCFは公式サポートからコミュニティサポートに移行されており、基本的に新規でWCFで作るような要件であればgRPCでの実装の方が推奨されてます。 https://docs.microsoft.com/ja-jp/aspnet/core/grpc/why-migrate-wcf-to-dotnet-grpc?view=aspnetcore-5.0#grpc-as-a-migration-path-for-wcf-to-net-core-and-net-5
Sitapper

2021/04/09 09:14

ご回答ありがとうございます。 あまり具体的な話になりますとややこしくなるかと思い単純化していますが、 それがいけないのかも知れません。 より具体的に言えば、ある工場のラインで製品の流れを監視している機械(*1)があるのです。 上記の例では、端末AとBのXはそれぞれこの機械からラインの情報を受け取って加工し、別の端末(*2)へ送っています。 二重化しているのは、365x24で動作している端末AやBが万一壊れても、この作業が(なるべく)止まらないようにするためです。 もちろん細かく言えば両方一度に壊れることもあるでしょうし、そもそも(*1)や(*2)が機能しなくなることもあるのですが、ここではそれについては考えません。 しかしながら、標準的な手法がないことは分かりました。 WCFについて少し調べて簡単なテストプログラムを作りかけていましたが、 過剰スペックということでやめておこうと思います。 質問した価値がありました。 ありがとうございます。 このように、使えない手法に時間をかけると勿体ないので、何かこういう方法がよく使われているよ、というのがあれば、最初からそれに当たれば、回り道が少なくて済むかと思ったのがそもそもの意図でした。 ありがとうございました。
Sitapper

2021/04/09 09:20

もう少し補足させていただきますと、そんなに止まったら困るものならもっとお金をかけてしっかりとした方策を、というお話もあるかと思いますが、それはそれでもっともで、そちらの担当が何か考えるかと思うのですが、私としてはとりあえず上記例の端末AとBで動作しているXの機能として二重化を考えている次第です。
Sitapper

2021/04/11 23:17

gentaroさんはじめ、ご回答くださいましたみなさま、ありがとうございました。 ソフトの開発経験があまりないので参考に質問させていただきましたが、 使わない方が良い手法にどっぷりはまる前にいろいろとご意見いただけて良かったです。 何で実装するかはまたこれから検討しようと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問