Mercurial > hg > Papers > 2020 > itsuki-thesis
diff final_main/chapter3/chapter3.tex @ 9:a37b7bd13be9
...
author | ichikitakahiro <e165713@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 11 Feb 2020 21:59:14 +0900 |
parents | f71206f427e3 |
children | 5ddb3e41e515 |
line wrap: on
line diff
--- a/final_main/chapter3/chapter3.tex Tue Feb 11 17:44:52 2020 +0900 +++ b/final_main/chapter3/chapter3.tex Tue Feb 11 21:59:14 2020 +0900 @@ -3,72 +3,61 @@ %%文書開始**************************** \begin{document} %%************************************** -\chapter{リモートエディタ} -リモートエディタとは他のマシン上に存在するファイルのバッファを別デバイスから開いて編集, 保存することができる機能である. 加えてこのリモートエディタを複数人が同時に同じファイルを編集し, その上変更がリアルタイムに反映されるように設計する. -この章ではリモートエディタの実装の上で踏んだプロセスや, 開発の上で問題となる点と解決策について説明する。 - +\chapter{スター型接続によるネットワーク通信} +リモートエディタのセッションに参加するノード(ユーザ)はスター型で接続を行い, リモートエディタの通信部分の障害に対する耐性を保障する. スター型とは中心となるノードから放射状に他のノードにそれぞれ一対一の接続を行う接続であり, 図:\ref{fig:star} はスター型接続をグラフ化した物である. 図で説明すると, node0がハブノード(サーバーの役割)として他のnode1, 2, 3, 4 と接続する。ここに新しくnode5が接続に加わると仮定すると, 他のノードと同様にnode0と接続する. -\section{編集位置の相違} -セッション中のエディタ間の通信で生じうる, 編集結果の相違について説明する. エディタ同士のコマンドの送信はそれぞれが独立して行うため, 編集対象の領域にエディタ間で相違が生じる場合がある. 例としてエディタが一対一の接続となっている時に発生しうる相違を図\ref{fig:difference} を使用して解説する. - 編集対象は各オフセット番号に同じ値の数字が入っているものとする. EditorA ではオフセット番号 3 の 3 という 要素を削除 (テキストエディタ上のため削除されたオフセットにはその後ろの要素が繰り上げられる.), EditorB では オフセット番号 2 に A という要素を挿入するという編集をしたとする. この編集を共通プロトコルとして互いに送信しあった際, 本来編集する予定だったオフセットの中身が異なってしまい編集結果に違いが生じてしまう. これらの問題を解決することのできるエディタ同士の通信手法を作成しなければならない。 - \begin{figure}[H] \centering \fbox{ - \includegraphics[scale=0.6]{./images/difference_offset.pdf} + \includegraphics[scale=0.7]{./images/Star-Topology.pdf} } -\caption{通信のすれ違いによる編集位置の相違} -\label{fig:difference} + \caption{スター型の接続をグラフ化した物} +\label{fig:star} \end{figure} -\section{編集位置の相違解消方法} -編集するオフセットに相違が発生する条件として, サーバーとノードがお互いにコマンドを送り合った際, その命令コマンドが相手に到着する前に相手が自身のバッファに変更を加えてしまった場合に起きる. したがって, 相違の解消に必要なことは +\section{スター型の利点と比較} + +先行研究においてはノードの通信をリング型, つまりノード同士を円となる形で接続することで実装を試みていた. +しかし, リング型には以下の欠点が見られた. +\begin{itemize} +\item ノードごとのもつファイルの整合性の維持が難しい. +\item どこかのノード同士の通信が切断された際の再接続が難しく, また障害が全体に影響してしまう. +\item 障害からの復帰が難しい. +\end{itemize} +などの問題が見られた. リング型と比較した際のスター型の利点として, \begin{itemize} -\item サーバーとノード間のコマンド送信のすれ違いが発生したということを検知する方法 -\item すれ違いが発生した際に編集したオフセットのズレを修正する方法 +\item ノードの中心(サーバー)が正しいファイル状況を保持するため,整合性を保つことが容易である. +\item どこかのノードの接続が切断されても, 障害の範囲をそのノードのみに抑えることができる. +\item 新しいノードが参加した, もしくはノードの再接続の際にはサーバーのファイル状況を参照するのみで参加, 復帰ができる. +\end{itemize} +と言ったことが挙げられる. +TopologyManagerの接続相手にラベルをつける機能により, サーバーでは各nodeすべてをまとめて一つの名前で処理をすることができる. 反対に各ノードもラベルを利用することで, CG内に大きな工夫をつけることなくサーバーとの通信を行うことができる. \\ +懸念点として +\begin{itemize} +\item 通信がサーバーのみに集中するため, それを原因に遅延が発生する可能性がある. +\item サーバーと他ノードとの一対複数という通信形式から発生する, 予期せぬ編集誤差の危険性. \end{itemize} -が挙げられる. +と言った点が挙げられる. これらの発生を防ぐため, +\begin{itemize} +\item 送信するデータ量や頻度を減らす工夫などを凝らし, 通信の負荷がなるべく少ない設計を構築する. +\item サーバーを中心とした整合性維持のための設計をする. +\end{itemize} +と言った対策が考えられる. + + +\newpage + +%%文書終了**************************** +\end{document} -\section{document listenerによる編集オフセット番号の読み取り} - エディタ同士の基本通信環境の構成のため, Chrisitie と同様のjava 言語で作成したエディタのインスタンスを使い, 異なるマシン同士の同期の実現を目指した. 自作エディタは java. swingの機能で構成されており, 追記または削除されたオフセット位置とその内容の取得はDocumentListenrを使用した. DocumentListenerのクラスはswingで実装したエディタ部分の入力と削除を検知し, 動作するメソッドであり, DocumentEvent内に入力されたオフセットとその長さや文字列が入力されるため, それをChrisitie側で検知し処理を行った. -insertUpdateメソッドではバッファに入力が行われた際に自動的に実行され, removeUpdateメソッドは同様に削除が行われた際に実行される. 他ノードから送信されてきた命令によるバッファの変更によっても実行され, 意図しないループが発生したため, 受信した命令では実行されないように記述をおこなった. - -\lstinputlisting[caption=DocumentListenerのコード部分, label=code:DocumentListener]{./src/DocumentListener.java} + + -\section{Command パターンによる命令オブジェクトの作成} -リモートエディタを実装する上において, 各エディタは自身に起きたバッファの変更を対応した他ノードに送信する必要がある. この変更の送り合いをCommand パターンとして実装した. Command パターンとは, 命令を一つのオブジェクトとして表現する方法である. コマンドパターンの利点として, -\begin{itemize} -\item インスタンスを利用して命令を作成するため, ChristieのGearの概念と相性が良い. -\item 命令に必要な内容をまとめて送信するため, 相違の発生を防ぐことができる. -\item 命令の管理が行いやすい, 行列に並ばせ命令の順番を管理したり, 命令の際実行, 取り消しが容易になる. -\end{itemize} -といった点が挙げられる. ソースコード:\ref{code:Command}は書き込み, 送信を行う際の命令をクラスとして作成したものである. このクラスのインスタンスを命令オブジェクトとして送信し合う. -\lstinputlisting[caption=Commandパターンとして実装した命令, label=code:Command]{./src/Command.java} - -\section{命令オブジェクトを実装する際に起きた問題} -インスタンス化した命令を他ノードに送信する際にエラーが発生し, 送信に失敗してしまうという問題が発生した. クラスの送信の際のシリアライズはmsgpackクラスを利用していた. -msgpackクラスは,シリアライズしたいクラスにMessage アノテーションをつけることにより, シリアライズ化を行う. 原因を調査した結果, 以下の原因が見つかった. -\begin{itemize} -\item Christieのjavaバージョンは11を使用していたが, msgpackバージョン0.6.12はjava11に対して対応していなかった. -\item msgpackの最新版0.8.20はシリアライズ機能が含まれなくなった. -\end{itemize} -以上の原因に対処するために以下のことを行った. - -\begin{itemize} -\item Christieのjavaバージョンを8まで下げ, msgpackバージョン0.6.12を動作できるようにした. -\item シリアライズする命令クラスに対し, フィールドをpublic にした. -\item javassistのバージョンを最新版へ変更した. -\end{itemize} - -javaのバージョンを下げたのは応急的な処置となってしまったが, これらの処置により問題なくCommandパターンでの命令実装を行うことができた. javaのバージョンに左右されずリモートエディタを実装するには, シリアライズの機能について他のパッケージを使うか, 自信で作成する必要が生まれた。 - -%%文書終了**************************** -\end{document}