ユーザーをサーバー情報ベースから追​​い出します。 Web サービスのパフォーマンスの向上 現在の接続にはコンフィギュレータ セッションが割り当てられていません

18.08.2023

バージョン 8.3.9.1818 で実装されました。

バージョン 8.3.9 では、さまざまなプラットフォーム メカニズムを最適化するための多数のタスクを完了しました。 ここではそのうちの一つについてお話したいと思います。 これは Web サービスのパフォーマンスの向上です。

セッションの再利用

Web サービスのパフォーマンスが低下するのは、Web サービスを呼び出すたびにセッションの作成と終了に大きなオーバーヘッドがかかることが原因でした。 さらに、作成中に SetSessionParameters() ハンドラーが実行されるたびに、これは一般的な構成では非常に「重い」可能性があります。

さらに、機能的にも問題がありました。 Web サービスはステートレスでした。 このため、Web サービス呼び出し間の状態の永続性を使用するロジックを実装することはできませんでした。

バージョン 8.3.9 では、Web サービス メカニズム (SOAP サービス、HTTP サービス、OData サービス) が改善されました。 その結果、生産性は約10倍に向上しました。

標準的な Enterprise Accounting 構成でテストを実施しました。 Counterparty ディレクトリからの選択を実行する HTTP サービスを追加しました。 テストでは、クライアントがサービスに対して 100 回の連続呼び出しを実行しました。 古い動作モードでは、これには 29.9 秒かかりました。 新しい動作モードでは、平均 3 秒です。

これらの結果は、セッションを確実に再利用するために 2 つの異なる戦略を実装したことにより達成されました。

  • プールからのセッションの自動再利用。
  • HTTP ヘッダーを使用したセッションの管理。

セッションの自動再利用では、クライアントはセッションの数とその存続期間を制御できません。 既存のセッション プールからセッションが自動的に割り当てられるだけです。 この戦略は、日常的な操作を実行し、統一された権限を持つクライアントによってアクセスされる高負荷のパブリック サービスに適しています。

たとえば、サーバーのピーク負荷の期間に備えて、遠隔地の小売店の取引活動を自動化することができます。 必要な数のセッションが処理に割り当てられます。 負荷が低下すると完了します。

別の例は、http サービス経由でドキュメント フロー設定にファイルを受信/配置することです。 このような操作には同じ特別ユーザーを使用できます。

手動セッション管理戦略は、クライアントがセッションの数とその存続期間を独立して管理することを意味します。 この戦略は、単一組織内の高度に統合されたシステムに最適です。 セッションの有効期間とその数を制御する独自のアルゴリズムを実装できます。

コントロール

構成オブジェクト ツリーで 1 つまたは別の戦略を使用する必要があるかどうかを判断し、必要に応じて、default.vrd パブリケーション ファイルでそれをオーバーライドできます。 構成オブジェクト ツリーで、Web サービス オブジェクトと HTTP サービス オブジェクトに 2 つの新しいプロパティを追加しました。

  • セッションの再利用には、「自動的に使用」、「使用」、または「使用しない」の値を指定できます。 [自動を使用] 値を指定すると、プールからのセッションの自動再利用が有効になり、[使用] 値を指定すると、HTTP ヘッダーを使用したセッション管理が有効になります。
  • SessionLifeTime プロパティでは、プラットフォームがセッションを自動的に終了するまでにセッションがアイドル状態になる秒数を指定できます。

ユーザーを強制的に終了する必要があるのは、主に次の場合です。

  • 情報ベースを更新する。
  • 新しいメタデータ オブジェクトを構成に追加します。
  • サーバー上で予防および修復作業を実行します。
  • ユーザー セッションがハングしているため、アプリケーションが再起動できません。

この記事では、ユーザー セッションを終了する方法、このタスクを実行するために管理者が用意しているツール、ファイル バージョンによって提供される終了オプションと 1C のクライアント/サーバー バージョンによって提供される終了オプションについて説明します。

セッションを強制的に終了すると、データが失われる可能性があることに注意してください。 したがって、不快な状況を避けるために、切断について事前にユーザーに警告することをお勧めします。

コンフィギュレータからセッションを終了する

データベース構造に変更が加えられると、動的構成更新は利用できなくなります。 そして、画面上に情報ウィンドウが表示されます (図 1)。

この場合のアクションの順序は明らかです。

  1. 「セッションを終了して繰り返す」ボタンをクリックする必要があります。
  2. データベースの再構築ウィンドウが表示されるまで待ちます。
  3. 「OK」をクリックします。

プログラム コードに加えられた変更では、ユーザーがシャットダウンする必要はありませんが、毎回アプリケーションを再起動する必要がないことに注意してください。 特定のコンピュータこのデバイスでは動作しません。

プログラムから直接セッションを終了する

ほとんどの標準 1C 製品バージョン 8 には、ユーザーの作業をリモートで簡単に終了し、管理者にデータベースへの排他的アクセスを提供するメカニズムが備わっています。 これが「インフォベースへの接続をブロックする」処理です。

次の 2 つのアドレスのいずれかで見つけることができます。

  1. 「サービス」セクションのサブメニューの 1 つ。
  2. 「操作」->「処理」セクションに移動します。

図2

外観処理を図 2 に示します。

この処理の特徴は次のとおりです。

  1. ボックスにチェックを入れるかチェックを外して「記録」ボタンをクリックすると、ユーザーのブロックのオンとオフが切り替わり、セッションが削除され、新しい接続が作成されなくなります。
  2. ブロッキング終了時刻を空にしたり、開始時刻よりも短くすることはできません。
  3. 「許可コード」パラメータが指定されている場合は、コードの前に「/UC」を指定することで、起動行にこのパラメータを入力してブロックを無視できます。
  4. 「許可コード」を指定しない場合、ブロック期間が経過する前にデータベースにアクセスするのは問題になります (ファイル バージョンの作業では、データベース フォルダーから 1CVcdn ファイルを削除することができます)。
  5. パラメータ「/UC」とスペースで区切られたパスワードの代わりに「/CALlow Users to Work」(C はラテン語)を指定すると、すべてのユーザーのブロックを完全に無効にすることができます。
  6. 「アクティブユーザー」ボタンをクリックすると、次のウィンドウが開きます。 完全なリストユーザー (図 3) から、「登録ログ」を開いたり、特定の各ユーザーのセッションを終了したりできます。

図3

上記の 2 つのオプションは、ファイル モードとクライアント/サーバー モードの両方で正常に機能します。 さらに、サーバー作業にのみ典型的なケースを検討します。

rdp からのユーザーの削除

ユーザー セッションをサーバーから切断できるのは、これを実行するための特定の権限がある場合のみであることに注意してください。

リモート デスクトップから作業している場合は、標準のタスク マネージャーを使用してユーザー セッションを終了できます。 単にセッションを中断するのは少し間違っていますが、非常に効果的です。

2 番目のオプションは、タスク マネージャーを使用することです。 リモート接続特定の各セッションを管理し、すべてのルールに従ってプログラムを終了する機能を備えています。 このメソッドは長いため、1 人のユーザーがログアウトしている間、他のワーカーによってプログラムが起動されないという保証はありません。

サーバーコンソール経由でユーザーを削除する

1C サーバー クラスターの管理者権限がある場合は、次のことを行う必要があります。


多くの場合、サーバー モードで作業している場合、ハングしたユーザー セッションはプラットフォーム ツールからは表示されず、コンソールからのみ削除できます。

セッションを中断する最も根本的な方法

上記の方法が機能しない状況は非常にまれです。 ただし、この問題が発生した場合は、データベースへの接続を中断する別の根本的な方法があります。それは、サーバーを物理的に再起動することです。

もちろん、作業を終えてデータを保存する時間がなかったユーザーは、そのような恥知らずな態度に非常に憤慨するでしょうが、これは高速で非常に効果的です。

1C:Enterprise 8 情報ベースで定期的なメンテナンスを実行するには、多くの場合、データベースへの排他的アクセスを取得する必要があります。 たとえば、データベースのバックアップを実行したり、DBMS サーバーで定期的なメンテナンス (インデックスの再作成など) を実行したりするには、すべてのアクティブなセッションを切断する必要があります。

1C:Enterprise サーバーの標準機能を使用して、ユーザーを情報ベースから切断する簡単な方法を見てみましょう。

標準機能

1C:Enterprise 8 のクライアント/サーバー バージョンについて説明することをすぐに予約させてください。セッションを無効にするには、サーバー管理コンソールに移動しましょう。 必要な情報ベースがリストに表示されます。

情報セキュリティのプロパティに移動して、「セッション開始のブロックを有効にする」オプションを設定します。 この場合、ログイン/パスワードの入力が必要になる場合があります。 アカウント情報ベース管理者。

セッションのロック期間を設定することを忘れないでください。 また、セッションがブロックされている間はすべてのバックグラウンド ジョブを停止する必要があることも確認する必要があります。 これは「ブロック」オプションを使用して行われます。 日常的なタスク"の上"。

必要に応じて、セッションがブロックされる 5 分前に通知を受けるユーザへのメッセージのテキストや、セッションのブロック期間中にインフォベースに入る許可コードを設定できます。

許可コードを使用して情報ベースにログインし、他のセッションが非アクティブなときに定期メンテナンスを実行できます。 パラメータを使用してデータベースに接続する場合は、許可コードを入力する必要があります。 たとえば、許可コードが「123456」の場合、サーバーに渡されるパラメータは次のようになります。

この方法でデータベースにログインすると、情報ベースへの排他的アクセスが得られます。 他のセッションは参加できません。

セッションがブロックされたというユーザー通知は次のようになります (管理者が入力したメッセージに応じて異なります)。 ブロック期間の 5 分前に 1 分ごとに表示されます。

セッションのブロック期間が開始すると、最初に通知が表示されます。

その後、セッションは終了します。

アクティブなセッションは、アクティブなセッションのリストから削除することで無効にすることもできます。 このアクションは、ハングしたセッションを終了するために必要になる場合があります。

実際には、ユーザーが入力したがまだ保存されていないデータが失われるリスクを軽減するために、ユーザーの切断について事前に通知することをお勧めします。

1C:Enterprise 8におけるセッションとコネクションの概念の違い

この記事から何を学ぶことができますか?

  • 1C に合格する際に最もよく聞かれる質問の 1 つに対する正解: エキスパート
  • 接続と1Cセッションの目的と特徴
  • セッションデータには何が保存されますか?

セッションと接続の違いは何ですか? 1C:Expert 試験のこの一見単純な質問は、多くの人を混乱させます。 豊富なプログラミング経験にもかかわらず、すべての専門家が明確で正しい答えを定式化できるわけではありません。

この記事では、この問題について詳しく分析します。 まず、1C:Enterprise のセッションと接続の概念を個別に見てみましょう。 この情報はプラットフォーム バージョン 8.2.x および 8.3.x に関連することに注意してください。

セッション1C

管理者向けガイドを参照してみましょう。 セッションの概念は次のように定義されています。

セッションは、情報ベースのアクティブなユーザーとこのユーザーの制御フローを定義します。

サーバー クラスターはユーザーを認識せず、代わりにセッションとセッション データを認識すると言えます。 原則として、クラスター管理コンソールには「ユーザー」セクションがありません。クラスターはセッションをユーザーとして認識します。

これにより、「セッション」項目の視覚的表現が確認され、アイコンがユーザーの形式で表示されます。

アクティブ ユーザーは必ずしもクライアント接続を意味するわけではなく、次の場合もあることを明確にする必要があります。

  • 1C:Enterprise クライアント アプリケーションのインスタンス
  • Webクライアントが実行されるWebアプリケーションインスタンス
  • コピー 外部結合、V83.COMConnector オブジェクトから取得
  • バックグラウンドジョブのインスタンス 1 つ
  • Webサービスへの1回の呼び出し

セッションデータ

セッションデータの概念を考えてみましょう。 セッションには次のような情報が含まれます。

  • 情報ベースの名前
  • セッション番号
  • 認証された情報ベースユーザーの名前
  • インターフェース言語
  • セッションパラメータ値
  • 一時保管
  • セッション統計
  • 管理申請フォーム情報
  • 一部の内部プラットフォーム データ

この情報をセッションデータと呼びます。 さらに、各アクティブ ユーザーは独自のセッション データを持ち、そのデータはそのユーザーの作業中にのみ関連します。 ユーザーがデータベースから離れる (セッションを終了する) と、そのセッション データは削除されます。

セッション データはサーバーのクラスターに保存され、クラスター マネージャーがこれを担当します。これがセッション データ サービスの目的です。 処理を高速化するために、セッション データはワーカー プロセスとシック クライアントにキャッシュされます。

サーバークラスターが再起動されると、セッションデータは保存されます。 アクティブ ユーザーが 20 分以内にクラスターに対して 1 回の呼び出しも行わず、セッションが接続に割り当てられていない場合、セッションはデータとともに削除されます。

セッションを維持するには シンクライアント Web クライアントは、少なくとも 10 分ごとにクラスターへのアクセスを提供します。

接続1C

ここで接続の概念を理解しましょう。 管理者ガイドをもう一度見てみましょう。

接続は、1C:Enterprise サーバーのクラスターへのセッションにアクセスする手段であり、限られた接続データのセットが含まれており、アクティブ ユーザーによって識別されません。

つまり、接続により、セッションがクラスターにアクセスできるようになります。 この場合、接続の数は制限されており、接続がセッションで不要になるとすぐに接続プールに返されます。

セッションがクラスターにアクセスしていない場合、つまりユーザーがアイドル状態である場合、接続はそのユーザーに割り当てられません。 したがって、セッションは接続がなくても存在できます。

セッション データはサーバーに保存されるため、接続が 20 分以内に切断された場合、接続は単なるアクセス手段であるため、セッションには影響しません。

例えば、誤って抜いてしまった場合 ネットワークケーブル、ケーブルが 20 分以内に接続された場合、ユーザーはエラー メッセージを受け取りません。 この場合、セッションには新しい接続が割り当てられ、実行が継続されます。 ユーザーは、おそらくわずかなフリーズを除いて、問題にさえ気づきません。

接続はクラスター プロセス間の通信にも使用されます。つまり、ワーカー プロセス (rphost) は、セッションではなく接続を使用してクラスター マネージャー (rmngr プロセス) と通信します。

接続とセッションの違い

これらの概念の主な違いを説明するために、たとえ話をします。

セッションが乗客で、接続がタクシーだとします。 乗客が帰宅する必要がある場合 (セッションがサーバーに接続する必要がある場合)、タクシーを呼び出します (セッションには接続プールからの接続が割り当てられます)。

乗客が家に到着し、再び仕事に行きたいが、タクシーがすでに出発した場合(接続後、接続が切断された)、乗客は新しいタクシーを呼んで仕事を続けます(新しい接続が割り当てられます)。セッション)。

この例えは、セッションと接続が同じものではなく、セッションが接続の切断後も簡単に存続できることを明確に示しています。

ブルミストロフ・アンドレイ

1C 8.3 セッションパラメータ— ユーザーセッション中に必要なパラメータの値を保存する変数。 本質的に、これは現在のユーザーのセッションに関連付けられた一種のグローバル変数です。

1C でのセッションパラメータの使用

セッションパラメータはプログラムによってのみ設定されます。 ユニバーサルインターフェースシステムにはセッションパラメータを設定するオプションはありません。 これらは通常、システム起動時に「セッション モジュール」で設定されます。 パラメータが定義されていない場合、パラメータにアクセスするとエラーが発生します。

1Cセッションパラメータの設定例

セッションパラメータを使用する典型的な例、つまり現在のユーザーを設定してみましょう。 の準備から例を挙げて説明します。

メタデータ ツリーで作成する 新しいパラメータセッション - CurrentUser、それにタイプを割り当てます - DirectoryLink.Individuals:

1C の 267 ビデオ レッスンを無料で入手:

セッション モジュールでは、現在のセッション パラメータを決定するプロシージャを作成します。

プロシージャコード:

手順 セッションパラメータ(必須パラメータ)の設定 // 物理的なものを探しています ユーザー名による人物 TechUser = ディレクトリ。 個人。 FindByName(ユーザー名()) ; //見つからない場合は新しく作成します TechUser の場合。 Empty() 次に、NewUser = ディレクトリ。 個人。 CreateItem() ; 新しいユーザー。 名前 = ユーザー名() ;新しいユーザー。 書く() ; 現在のユーザー = 新しいユーザー。 リンク; EndIf ;