context.CommandTimeout = 180;
برای رفع این مشکل مراحل زیر را انجام دهید:
- دو فایل tt موجود در مدل را حذف نمایید.
context.CommandTimeout = 180;
برای رفع این مشکل مراحل زیر را انجام دهید:
شاید مهمترین اصل در سیستمهای توزیع شده، تقسیم وظایف در سخت افزارهای جداگانه و نحوه مدیریت ارتباط بین این وظایف باشد. مدیریتی که بدون آن، زمانیکه تعداد وظایف سیستم شما زیاد میشود، سیستم را با مشکلات جدی روبرو میکند. به احتمال زیاد شما نیز تاکنون با چنین مشکلاتی مواجه شدهاید، آن هم زمانیکه تعداد Applicationهای سیستمهایتان زیاد میشود و به تدریج وابستگیها و ارتباطات بین آنها نیز افزایش پیدا کرده و بدلیل اینکه شما از قبل زیرساختی برای مدیریت این ارتباطات ایجاد نکردهاید، کم کم کنترل این ارتباطات از دست شما خارج شدهاست. به همین دلیل من نیز میخواهم پیاده سازی سیستمهای توزیع شده را از نحوه مدیریت ارتباطات و وابستگیهای قسمتهای مختلف یک سیستم آغاز کنم تا بتوانیم از ابتدای ایجاد سیستم توزیع شده، زیرساخت درستی نیز برای مدیریت وابستگیها و ارتباطات قسمتهای مختلف آن داشته باشیم. پس بیایید با ارائه مثالی که به احتمال زیاد شما هم تابحال با آن روبرو شدهاید، با هم ببینیم که چگونه داشتن یک روش واحد و انعطاف پذیر برای مدیریت ارتباط بین سیستمهای مختلف میتواند به ما در تقسیم بندی وظایف، یکپارچگی سیستم، بالا بردن کارآیی و مدیریت بهتر کل سیستم کمک کند.
فرض
کنید ما چندین سیستم بزرگ مرتبط یا غیر مرتبط به هم داریم که هر کدامشان از چندین
زیر سیستم تشکیل شدهاند. ارتباط و وابستگی این سیستمها به این صورت است که یا از سیستمهای دیگر سرویسهایی را دریافت میکنند، یا دادههای مورد استفاده در آنها توسط سیستمهای دیگر تولید میشوند و آنها در بازه زمانی مشخصی این دادهها را در سیستمهای خودشان بروزرسانی میکنند.
همانطور که میبینید کل سیستم ما از همکاری تعدادی سیستم بزرگ تشکیل شدهاست که هرکدام از این سیستمهای بزرگ نیز از همکاری دو نوع زیر سیستم تشکیل شدهاند. نوع اول این زیرسیستمها که با عبارت Sub System مشخص شدهاند، زیر سیستمهایی هستند که تنها در همان سیستم استفاده میشوند و نوع دوم که با عبارت Common Sub System مشخص شدهاند و ما نیز زیاد با آنها روبرو میشویم، زیرسیستمهایی هستند که بصورت مشترک بین دو یا چند سیستم بزرگ مورد استفاده قرار میگیرند. بعنوان مثال میتوان زیرسیستم ارسال پیامک، ارسال ایمیل، مدیریت Log، زیر سیستم پرداخت و هر نوع زیرسیستم دیگری را که در سیستمهای مختلف بصورت مشترک استفاده میشود، نام برد.
به احتمال زیاد همه کسانیکه در سیستمهای رو به رشد و بزرگ کار کردهاند خوب میدانند که با بزرگتر شدن سیستمها و افزایش تعداد سیستمهای مرتبط و وابسته به هم، در صورت نبود یک روش واحد و انعطاف پذیر برای مدیریت ارتباط بین سیستمهای مختلف، چه مشکلاتی برای کل سیستم بوجود میآید. مشکلاتیکه در ابتدای شروع سیستم به هیچ وجه به چشم نمیآمدند، اما با توسعه و رشد سیستم، برایمان جدی میشوند.
بطور مثال زمانیکه اطلاعات پایه سیستم شما توسط یک یا چند سیستم تولید میشوند و سایر سیستمها بخاطر پایین نیامدن کارآیی سیستم خودشان مجبورند دادههای سیستم پایه را در سیستم خودشان Replicate کنند، شما چه روشی را برای بروز رسانی دادههای سایر سیستمها ارائه میدهید؟ شاید سادهترین و اولین روشی که به ذهنمان برسد، ایجاد یک Job باشد که با اجرا شدن در بازه زمانی مشخصی (مثلا شبانه) عملیات بروزرسانی را انجام دهد. این روش دو مشکل اساسی دارد: اول اینکه بصورت RealTime نیست. یعنی از زمانیکه داده وارد سیستم پایه میشود، تا زمانیکه Job اجرا شود، سیستمهای دیگر نمیتوانند از داده جدید استفاده کنند و دوم اینکه با اضافه شدن به تعداد سیستمهای وابسته شما مجبورید یا یک Job جدید را برای آن پیاده سازی کنید، یا قبلی را تغییر دهید. شاید شما با پیاده سازی چند سرویس در سیستمهای پایه و وابسته بتوانید مشکل RealTime نبودن بروز رسانی داده را حل کنید، اما این روش نیز بدون مشکل نیست. شاید اولین مشکل این روش این باشد، در صورتیکه در زمان فراخوانی، یکی از طرفین در دسترس نباشد، دادهها بروز رسانی نشوند و حل این مشکل پیچیدگی زیادی را برای شما بوجود بیاورد و دومین مشکل این است که در این روش نیز مانند روش قبل، با اضافه شدن به تعداد سیستمهای وابسته شما مجبورید یا سرویسهای جدیدی را برای این کار ایجاد کنید، یا سرویسهای قبلی را تغییر دهید. تکرار این روال باعث میشود شما پس از مدتی با انبوهی از سرویسهای مختلف رو برو شوید که مدیریت آنها برای شما بسیار دشوار است.
یکی دیگر از مشکلاتیکه ممکن است بوجود بیاید این است که با بزرگتر شدن و افزایش تعداد سیستمها، تعداد زیر سیستمهای تکراری نیز افزایش پیدا میکند که این خود ممکن است باعث شود یکپارچگی سیستم ما از بین برود. بنظر شما بهتر نبود زیرسیستمهای تکراری را اینقدر در سیستمهای مختلف تکرار نکنیم و با درنظر گرفتن آنها بعنوان یک یا چند زیرسیستم مستقل، کارآیی، یکپارچگی و مدیریت کل سیستم را افزایش دهیم؟
وجود مشکلات فوق و سایر مشکلاتی که ممکن است با بزرگتر شدن سیستم و افزایش تعداد آنها بوجود بیایند (که باتوجه به تجربه شما بنظرم نیازی به ذکر آنها نیست) با مرور زمان پیچیدگیهای بسیار زیای را در سیستم ما بوجود میآورد که شاید حل کردن آن امکان پذیر نباشد یا حداقل نیاز به صرف زمان و هزینه زیادی داشته باشد. پس شاید بهتر باشد در ابتدای پیاده سازی سیستم، زیرساخت درستی را برای ارتباط بین سیستمهای مختلف ایجاد کنیم.
اما چگونه میتوانیم این مجموعه سیستم را با هم ادغام کنیم و برای همه آنها یک هدف را مشخص کنیم و به آنها اجازه بدهیم با استفاده از یک روش واحد، انعطاف پذیر و کم هزینه، با یکدیگر در ارتباط باشند؟
باید بگویم که این مشکل با استفاده از Message Broker حل میشود .
یک Message Broker یک کامپوننت فیزیکی است که ارتباطات بین سیستمهای مختلف را مدیریت میکند و درواقع برای حل مشکلات مرتبط با نحوه مدیریت ارتباطات و وابستگیهای بین سیستمهای مختلف طراحی شده است. با استفاده از Message Broker بجای اینکه سیستمهای مختلف بصورت مستقیم با یکدیگر در ارتباط باشند، تنها با Message Broker در ارتباط اند و در اینجا Message Broker نقش یک Interface را بصورتی ایفا میکند که وظیفه آن به حداقل رساندن وابستگیهای مستقیم بین سیستمهای مختلف است. همچنین نحوه ارتباط قسمتهای مختلف هم به این صورت است که یک سیستم با ارائه مشخصات گیرنده یا گیرندگان، یک Message را برای Message Broker ارسال میکند و سپس Message Broker با روشها و الگوریتمهایی که در اختیار دارد و با جستجو در بین سیستمهایی که با آن مشخصات در آن ثبت شدهاند، Message را برای آنها ارسال میکند.
ارتباط بین Application ها تنها شامل ارسال کننده و Message broker و گیرندههای مشخص شدهاست و سایر سیستمها در آن دخیل نیستند. همچنین بدلیل اینکه Message Brokerها از یک صف انتقال اطلاعات استفاده میکنند، احتمال از دست رفتن Messageها به حداقل ممکن میرسد. یعنی زمانیکه یک سیستم، Messageی را برای Message Broker ارسال میکند، Message Broker تا زمانیکه دریافت کنندگان Message، آن را دریافت نکنند، آن Message را از صف انتقال حذف نمیکند. پس زمانیکه یک ارسال کننده Messageی را برای Message Broker ارسال میکند، حتی در صورتیکه دریافت کننده یا دریافت کنندگان در دسترس نیز نباشند، Message Broker این قابلیت را دارد تا زمانیکه دوباره دریافت کنندگان در دسترس باشند، Messageها را نگهداری کند. زیرا از دیدگاه کنترل جریان، Message Brokerها محدودیتی در تعداد سیستمهای متصل به خودشان و زمان اتصال آنها ندارند. یعنی Message Brokerها این قابلیت را دارند حتی در زمان اجرا نیز سیستمهای جدید را بپذیرند. بطور خلاصه Message Brokerها مدیریت همکاری بین سیستمهای مختلف را بر عهده دارند. قرار دادن Message Brokerها بین ارسال کنندگان و دریافت کنندگان، انعطاف پذیری را در ارتباط بین سیستمهای مختلف افزایش میدهد و با کمترین میزان تغییر در ارسال کنندگان و گیرندگان میتوانید قابلیتهای جدیدی را به سیستم اضافه کنید.
با این روش شما میتوانید با کمترین هزینه برای سیستمهای درگیر، تغییرات سیستمهای پایه را در سیستمهای وابسته اعمال کنید؛ آن هم بصورتیکه با افزایش تعداد سیستمهای وابسته، نیازی به تغییر در سیستم پایه و سایر سیستمها نباشد. همچنین با این روش شما به راحتی و کمترین هزینه میتوانید تمامی زیرسیستمهای خود ازجمله زیرسیستمهای مشترک را بصورت یک زیرسیستم مستقل پیاده سازی کنید و با این کار یکپارچگی کل سیستم خود را افزایش دهید. کارآیی آنها را بالا ببرید و با مستقل شدن آنها مدیریت آنها را برای خودتان سادهتر کنید.
انواع مختلفی از Message Brokerها وجود دارند که هر کدام از آنها مزایا و معایب خاص خودشان را دارند و به دلیل اینکه من در سری مقالات سیستمهای توزیع شده سعی دارم شما را با مبانی پیاده سازی آنها آشنا کنم، تنها یکی از آنها را مورد بررسی قرار میدهم و مقایسه و تصمیم گیری در مورد اینکه کدامیک از آنها کارآیی بیشتری را برای شما دارد، بر عهده خودتان میگذارم. من در اینجا شناخته شدهترین Message Brokerهایی را که در دسترس هستند و شما میتوانید از آنها استفاده کنید، به شما معرفی میکنم.
لیست Message brokerها:
در فصل بعد من سعی میکنم شما را با Rabbitmq که از معروفترین، پایدارترین و قابل اعتمادترین Message Brokerهایی که شخصا چندین سیستم را با استفاده از آن پیاده سازی کردهام، آشنا کنم و ببینیم که چگونه این ابزار میتواند به ما در رفع مشکلاتیکه در نحوه مدیریت و سازماندهی سیستمهای مختلف بوجود میآیند، کمک کند.
البته این نکته را نیز باید ذکر کنم که همانطور که میبینید همیشه دلیل استفاده کردن از سیستمهای توزیع شده، بالابردن کارآیی نیست. ما میتوانیم برای پیاده سازی سیستمهای توزیع شده دلایل و اهداف دیگری نیز داشته باشیم. همانطور که مشاهده کردید ما نهتنها از Message Brokerها میتوانیم در سیستمهایی که واقعا تمام اجزایشان بصورت توزیع شده پیاده سازی شدهاند، استفاده کنیم، بلکه میتوانیم از آنها برای مدیریت وابستگیها و ارتباطات بین سیستمهای فعلی که داریم نیز استفاده کنیم و درواقع بصورت واقعی و فنی برای همه آنها هدف واحدی را تعریف کنیم. فعلا هدف من این است که با هم ببینیم چگونه میتوانیم وظایف مختلف سیستم را در سخت افزارهای مختلف، تقسیم کنیم و ارتباطات آنها را مدیریت کنیم. در فصلهای بعد میبینیم که برای رسیدن به اهداف دیگر سیستمهای توزیع شده از چه روشها و ابزارهای دیگری میتوان استفاده کرد.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.Common; namespace DBFactory { public partial class Form1 : Form { private string _MySQLProvider = "MySql.Data.MySqlClient"; private string _SQLProvider="System.Data.SqlClient"; private string _OracleProvider ="System.Data.OracleClient"; private DbProviderFactory _DbProviderFactory; private DbConnection _DbConnection = null; private DbCommand _DbCommand = null; private DbDataAdapter _DbDataAdapter = null; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { try { string _SQLconnectionstring = "Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Test;Data Source=FARHAD-PC"; string _Oracleconnectionstring = "Data Source=ServiceName;User Id=Username;Password=Password"; _DbProviderFactory = DbProviderFactories.GetFactory(_SQLProvider); _DbConnection = _DbProviderFactory.CreateConnection(); _DbConnection.ConnectionString = _SQLconnectionstring; _DbConnection.Open(); if (_DbConnection.State == ConnectionState.Closed) { MessageBox.Show("اتصال با دیتابیس برقرار نشده است"); } else { MessageBox.Show("اتصال با دیتابیس با موفقیت بر قرار شده است"); } } catch (System.Exception excep) { MessageBox.Show(excep.Message.ToString()); } } } }
private string _MySQLProvider = "MySql.Data.MySqlClient"; private string _SQLProvider="System.Data.SqlClient"; private string _OracleProvider ="System.Data.OracleClient";
_DbProviderFactory = DbProviderFactories.GetFactory("System.Data.SqlClient");
DbCommand DbCommandBuilder DbConnection DbDataAdapter DbDataReader DbException DbParameter DbTransaction