How does FreeSWITCH compare to Asterisk? Why did you start over with a dịch - How does FreeSWITCH compare to Asterisk? Why did you start over with a Việt làm thế nào để nói

How does FreeSWITCH compare to Aste

How does FreeSWITCH compare to Asterisk? Why did you start over with a new application? These are questions I’ve been hearing a lot lately so I decided to explain it for all of the telephony professionals and enthusiasts alike who are interested to know how the two applications compare and contrast to each other. I have a vast amount of experience with both applications with about 3 years of doing asterisk development under my belt and well, being the author of FreeSWITCH. First I will provide a little history and my experience with Asterisk, then I will try to explain the motivations and the different approach I took with FreeSWITCH.

I first tried Asterisk in 2003. It was still pre 1.0 and VoIP was still very new to me. I downloaded and installed it and in a few minutes I was tickled pink over the dial tone emitting from my phone plugged into the back of my computer. I spent the next few days playing with my dial plan and racking my brain to think of cool stuff I could do with a phone that was hooked up to a Linux PC. Since I had done an extensive amount of web development in my past life I had all sorts of nifty ideas like matching the caller id to the customer’s account number and trying to guess why they were calling etc. I also wanted to move on in my dial plan based on pattern matching and started hacking my first module. Before I knew it I had made the first cut of app_perl, now res_perl where I had embedded a Perl5 interpreter in Asterisk.

Now that I had that out of my system, I started developing an Asterisk-driven infrastructure to use for our inbound call Queues. I prototyped it using app_queue and the Manager Interface now proudly dubbed “AMI” (initials always make things sound cooler). It was indeed magnificent! You could call in from a PSTN number over a T1 and join a call queue where our agents who also called in could service the calls. “This rocks!” I thought to myself as I watched from my fancy web page showing all the queues and who was logged in. It even refreshed periodically by itself which was why I was surprised when the little icon in the corner of my browser was still spinning for quite some time. That’s when I first heard it. That word. The one I can never forget, deadlock.

That was the first time, but it wasn’t the last. I learned all about the GNU debugger that day and it was just the first of many incidents. Deadlock in the queue app. Deadlock in the manager, Avoiding Deadlock on my console. It was starting to get to me a little but I kept going. By this time I was also quite familiar with the term Segmentation Fault another foe to the computer developer. After about a year’s time wrestling with bugs I found myself a lot more well-versed in the C programming language than I even imagined and near Jedi caliber debugging skills. I had a working platform running several services on a DS3 worth of TDM channels spread over 7 asterisk boxes and I had given tons of code to the project including some entire files on which I hold the copyright. http://www.cluecon.com/anthm.html

By 2005, I had quite a reputation as an asterisk developer. They even thanked me in both the CREDITS file and in the book, Asterisk, The Future of Telephony. I not only had tons of applications for asterisk in tree, I had my own collection of code they did not need or want on my own site. (Still available today at http://www.freeswitch.org/node/50)
Despite all of this I could not completely escape the deadlocks and crashes. I hid the problem well with restart scripts and 7 machine clusters but I could not see a way to scale my platform much more. I had to abandon some features because they just would not work right based on the way Asterisk was designed.

Asterisk uses a modular design where a central core loads shared objects to extend the functionality with bits of code known as “modules”. Modules are used to implement specific protocols such as SIP, add applications such as custom IVRs and tie in other external interfaces such as the Manager Interface. The core of Asterisk is a threading model but a very conservative one. Only origination channels and channels executing an application have threads. The B leg of any call operate only within the same thread as the A leg and when something happens like a call transfer the channel must first be transferred to a threaded mode which often times includes a practice called channel masquerade, a process where all the internals of a channel are torn from one dynamic memory object and placed into another. A practice that was once described in the code comments as being “nasty”. The same went for the opposite operation the thread was discarded by cloning the channel and letting the original hang-up which also required hacking the cdr structure to avoid seeing it as a new call. One will often see 3 or 4 channels up for a single call during a call transfer because of this.

/* XXX This is a seriously wacked out operation. We're essentially putting the guts of
the clone channel into the original channel. Start by killing off the original
channel's backend. I'm not sure we're going to keep this function, because
while the features are nice, the cost is very high in terms of pure nastiness. XXX */

This became the de facto way to pull a channel out of the grips of another thread and the source of many headaches for application developers. This uncertain threading scheme was one of the motivating factors for a rewrite.

Asterisk uses linked-lists to manage its open channels. A linked-list is a series of dynamic memory chained together by using a structure that has a pointer to its own type as one of the members allowing you to endlessly chain objects and keep track of them.
They are indeed a useful programming practice but when used in a threaded application become very difficult to manage. One must use mutexes, a kind of traffic light for threads to make sure only 1 thread ever has write access to the list or you risk one thread tearing a link out of a list while another is traversing it. This also leads to horrible situations where one thread may be destroying or masquerading a channel while another is accessing it which will result in a Segmentation Fault which is a fatal error in the program and causes it to instantly halt which, of course means in most cases all your calls will be lost. We’ve all seen the infamous “Avoiding initial deadlock” message which essentially is an attempt to lock a channel 10 times and if still won’t lock, just go ahead and forget about the lock.

The manager interface or AMI has a concept where the socket used to connect the client is passed down into the applications letting your module have direct access to it and essentially write any data you want to that socket in the form of Manager Events which are not very structured and thus the protocol is very difficult to parse.

Asterisk’s core has linking dependencies on some of it’s modules which means that the application will not start if a certain module is not present because the core is actually using some of the binary code from the module shared object directly. To make a call in asterisk in at least version 1.2 you have no choice but to use app_dial and res_features because the code actually lives in those modules. The logic to establish a call and to do things like a forked dial actually reside in app_dial not the core, and res_features actually contains the top level function that bridges the audio.

Asterisk has no protection of its API. The majority of the functions and data structures are public and can easily be misused or bypassed. The core is anarchy with assumptions about channels having a file descriptor, which is not always necessary in reality but is mandatory for any asterisk channel. Many algorithms are repeated throughout the code in completely different ways with every application doing something different on seemingly identical operations.

This is only a brief summary of the leading issues I had with Asterisk. I donated my time as a coder, my servers to host the CVS repository and served as a bug marshal and maintainer. I organized a weekly conference call to plan for the future and address some of the issues I have described above. The problem was, when one looks at this long list of fundamental changes then thinks about how much work it would take and how much code may have to be erased or rewritten, the motivation to address the issues begins to fade. I could tell not many people would be on board with my proposal to start a 2.0 branch and rewrite the code. That is why in the summer of 2005 I decided I would do it myself.

My primary focus on FreeSWITCH was to start from the core and trap all the common functionality under the hood and expose it in a pyramid to the higher levels of the application. Like Asterisk, the Apache Web Server heavily inspired me and I chose to use a modular design. From the first day the basic fundamentals I chose to adhere to were that every channel has it’s own thread no matter what it was doing and that thread would use a state machine function to navigate its way through the core. This would ensure that every channel would follow the same predictable path and state hooks and overrides could be placed into the machine to add important functionality very similar to how methods and class inheritance works in an object oriented programming language.

It hasn’t been easy. Let me tell you. I’ve had my fair share of Segmentation Faults and Deadlocks while coding FreeSWITCH , (a lot more of the former than the latter I must say). But I built the code from the core and went from there. Since all of the channels operate in their own thread and there are occasions where you need to interact with them, I use read/write locking so the channels can be located from a hashing algorithm rather than a linked list and there is an absolute guarantee that the channel cannot be accessed or go away while an outside thread has reference to
0/5000
Từ: -
Sang: -
Kết quả (Việt) 1: [Sao chép]
Sao chép!
FreeSWITCH so sánh với Asterisk như thế nào? Tại sao bạn đã bắt đầu hơn với một ứng dụng mới? Đây là những câu hỏi tôi đã nghe rất nhiều gần đây do đó, tôi quyết định để giải thích nó cho tất cả các điện thoại các chuyên gia và những người đam mê cũng như những người quan tâm để biết làm thế nào hai ứng dụng so sánh và tương phản với nhau. Tôi có một số lượng lớn các kinh nghiệm với cả hai ứng dụng với khoảng 3 năm làm phát triển asterisk dưới vành đai của tôi và cũng, là tác giả của FreeSWITCH. Trước tiên tôi sẽ cung cấp một chút lịch sử và kinh nghiệm của tôi với Asterisk, sau đó tôi sẽ cố gắng giải thích những động lực và phương pháp tiếp cận khác nhau tôi đã diễn với FreeSWITCH.

tôi lần đầu tiên đã cố gắng Asterisk vào năm 2003. Nó vẫn là trước 1.0 và VoIP là vẫn còn rất mới với tôi. Tôi đã tải về và cài đặt nó và trong một vài phút tôi đã được tickled hồng trên tín hiệu quay số phát ra từ điện thoại của tôi cắm vào mặt sau của máy tính của tôi. Tôi đã dành vài ngày tới chơi với kế hoạch quay số của tôi và làm đau đớn não của tôi để suy nghĩ của công cụ mát tôi có thể làm với một điện thoại được nối với một máy tính Linux. Kể từ khi tôi đã làm một số tiền phong phú của phát triển web trong cuộc sống quá khứ của tôi tôi đã có tất cả các loại của các ý tưởng thuận tiện như phù hợp với id người gọi đến số tài khoản của khách hàng và cố gắng để đoán tại sao họ đã kêu gọi vv. Tôi cũng muốn di chuyển vào trong kế hoạch quay số của tôi dựa trên mô hình kết hợp và bắt đầu hacking mô-đun đầu tiên của tôi. Trước khi tôi biết nó tôi đã thực hiện việc cắt giảm đầu tiên của app_perl, bây giờ res_perl nơi tôi đã nhúng một thông dịch viên Perl5 trong Asterisk.

bây giờ mà tôi đã có mà ra khỏi hệ thống của tôi, tôi bắt đầu phát triển cơ sở hạ tầng Asterisk lái xe để sử dụng cho hàng đợi cuộc gọi trong nước của chúng tôi. Tôi prototyped nó sử dụng app_queue và giao diện quản lý bây giờ tự hào được gọi là "AMI" (initials luôn luôn thực hiện những điều âm thanh mát). Đó là thực sự tuyệt vời! Bạn có thể gọi từ một số PSTN trên một T1 và tham gia một hàng đợi cuộc gọi nơi của chúng tôi đại lý cũng gọi là trong có thể phục vụ các cuộc gọi. "Điều này đá!" Tôi nghĩ đến bản thân mình như tôi dõi từ của tôi trang web ưa thích Hiển thị tất cả các hàng đợi và những người đã đăng nhập. Nó thậm chí làm mới theo định kỳ của chính nó mà là lý do tại sao tôi đã ngạc nhiên khi biểu tượng nhỏ ở góc của trình duyệt của tôi vẫn quay cho thời gian khá lâu. Đó là khi tôi lần đầu tiên nghe nó. Từ đó. Một trong tôi không bao giờ có thể quên, bế tắc.

đó là lần đầu tiên, nhưng nó không phải là cuối cùng. Tôi đã học được tất cả về GNU gỡ rối ngày hôm đó và nó đã là chỉ là người đầu tiên của nhiều sự cố. Bế tắc trong hàng đợi app. bế tắc trong quản lý, tránh bế tắc trên giao diện điều khiển của tôi. Nó đã bắt đầu để có được cho tôi một chút nhưng tôi sẽ giữ. Bởi thời gian này tôi cũng đã khá quen thuộc với thuật ngữ phân khúc lỗi một kẻ thù để phát triển máy tính. Sau khi khoảng thời gian một năm đấu vật với lỗi tôi tìm thấy bản thân mình nhiều hơn cũng-versed trong ngôn ngữ lập trình hơn tôi thậm chí tưởng tượng và gần tầm cỡ Jedi gỡ lỗi kỹ năng. Tôi đã có một nền tảng làm việc chạy một số dịch vụ trên một DS3 giá trị của TDM kênh lây lan hơn 7 asterisk hộp và tôi đã cho tấn mã cho dự án bao gồm một số tập tin toàn bộ mà tôi giữ bản quyền. http:www.cluecon.com/ anthm.html

By năm 2005, tôi đã có khá một danh tiếng như là một nhà phát triển asterisk. Họ thậm chí cảm ơn tôi trong cả hai tập tin tín dụng và trong cuốn sách, dấu sao, tương lai của điện thoại. Tôi không chỉ có tấn của các ứng dụng cho asterisk trong cây, tôi đã có bộ sưu tập của riêng tôi mã họ không cần hoặc muốn trên trang web của riêng tôi. (Vẫn còn hiện nay tại http://www.freeswitch.org/node/50)
Mặc dù tất cả điều này tôi có thể không hoàn toàn thoát khỏi deadlocks và các vụ đụng. Tôi đã giấu vấn đề với tập lệnh khởi động lại và 7 máy cụm nhưng tôi không thể nhìn thấy một cách để quy mô nền tảng của tôi nhiều hơn nữa. Tôi đã từ bỏ một số tính năng bởi vì họ chỉ sẽ không làm việc đúng dựa trên đường đi Asterisk được thiết kế.

Asterisk sử dụng một thiết kế mô-đun nơi một lõi trung tâm tải các đối tượng được chia sẻ để mở rộng các chức năng với các bit của mã được gọi là "mô-đun". Mô-đun được sử dụng để thực hiện các giao thức cụ thể chẳng hạn như SIP, thêm các ứng dụng chẳng hạn như tùy chỉnh IVRs và tie trong giao diện bên ngoài khác chẳng hạn như giao diện quản lý. Cốt lõi của Asterisk là một mô hình luồng nhưng một rất bảo thủ. Chỉ nguyên kênh và kênh thực hiện một ứng dụng có chủ đề. Chân B của bất kỳ cuộc gọi hoạt động chỉ trong các chủ đề tương tự trong chặng A và khi một cái gì đó xảy ra như một cuộc gọi chuyển các kênh đầu tiên phải được chuyển sang một chế độ ren thông thường bao gồm một thực tế được gọi là kênh masquerade, một quá trình mà tất cả các internals của một kênh là rách từ một bộ nhớ năng động đối tượng và đặt vào khác. Một thực tế rằng một lần được mô tả trong các ý kiến mã là "khó chịu". Cùng đi cho các hoạt động đối diện các chủ đề được loại bỏ bằng nhân bản các kênh và cho phép hang-up gốc cũng đòi hỏi hacking cấu trúc cdr để tránh nhìn thấy nó như là một cuộc gọi mới. Một thường xuyên sẽ thấy 3 hoặc 4 kênh cho một cuộc gọi duy nhất trong một chuyển cuộc gọi bởi vì điều này.

/ * XXX đây là một hoạt động nghiêm túc sợ. Về cơ bản chúng tôi đang đưa hết can đảm của
kênh clone vào kênh gốc. Bắt đầu bằng cách giết chết bản gốc
của kênh phụ trợ. Tôi không chắc chắn chúng tôi sẽ giữ chức năng này, bởi vì
trong khi các tính năng là tốt đẹp, chi phí là rất cao trong điều khoản của tinh khiết nastiness. XXX * /

điều này trở thành con đường trên thực tế để kéo một kênh trong grips của một chủ đề và nguồn gốc của nhiều đau đầu cho nhà phát triển ứng dụng. Điều này không chắc chắn luồng đề án là một trong những yếu tố thúc đẩy cho một ghi đè.

Asterisk sử dụng liên kết danh sách để quản lý kênh mở của nó. Một liên kết-danh sách là một loạt các bộ nhớ năng động chuỗi với nhau bằng cách sử dụng một cấu trúc có một con trỏ đến loại riêng của mình như là một trong các thành viên cho phép bạn vô tận chuỗi đối tượng và theo dõi các họ.
họ đang thực sự là một thực hành lập trình hữu ích nhưng khi được sử dụng trong một ứng dụng ren trở nên rất khó khăn để quản lý. Người ta phải sử dụng mutexes, một loại đèn giao thông cho các chủ đề để đảm bảo rằng chỉ có 1 chủ đề bao giờ có quyền truy cập ghi vào danh sách hoặc bạn có nguy cơ một sợi rách một liên kết trong một danh sách trong khi một đi qua nó. Điều này cũng dẫn đến khủng khiếp tình huống nơi một sợi có thể phá hủy hoặc giả mạo một kênh trong khi khác đang truy nhập nó mà sẽ gây ra một lỗi phân khúc đó là một lỗi nghiêm trọng trong chương trình và làm cho nó ngay lập tức ngừng mà, tất nhiên có nghĩa là trong nhiều trường hợp tất cả các cuộc gọi của bạn sẽ bị mất. Chúng tôi đã nhìn thấy tất cả tin nhắn "Tránh bế tắc ban đầu" khét tiếng mà về cơ bản là một nỗ lực để khóa một kênh 10 lần và nếu vẫn sẽ không khóa, chỉ cần đi trước và quên về khóa.

Giao diện quản lý hoặc AMI có một khái niệm, nơi các ổ cắm được sử dụng để kết nối các khách hàng được thông qua thành các ứng dụng cho phép của bạn mô-đun có quyền truy cập trực tiếp vào nó và về cơ bản ghi bất kỳ dữ liệu bạn muốn rằng ổ cắm trong các hình thức quản lý sự kiện đó là không có cấu trúc rất và do đó các giao thức là rất khó khăn để phân tích cú pháp.

Cốt lõi của Asterisk có liên kết phụ thuộc vào một số của nó mô-đun có nghĩa là các ứng dụng không có sẽ bắt đầu nếu một mô-đun nào đó không phải là hiện nay bởi vì lõi thực sự sử dụng một số mã nhị phân từ mô-đun được chia sẻ đối tượng trực tiếp. Để thực hiện cuộc gọi trong asterisk trong ít phiên bản 1.2 bạn có không có sự lựa chọn nhưng để sử dụng app_dial và res_features bởi vì mã thực sự sống trong những mô-đun. Logic để thiết lập một cuộc gọi và làm những thứ như một quay số xẻ thùy thực sự nằm trong app_dial không cốt lõi, và res_features trên thực tế chứa các chức năng cấp trên cầu âm thanh.

Asterisk có không có bảo vệ của API của nó. Phần lớn các cấu trúc dữ liệu và chức năng công khai và có thể dễ dàng được lạm dụng hay bỏ qua. Cốt lõi là tình trạng hỗn loạn với các giả định về kênh có một mô tả tập tin, mà là không luôn luôn cần thiết trong thực tế, nhưng là bắt buộc đối với bất kỳ kênh asterisk. Nhiều thuật toán được lặp lại trong suốt mã theo cách hoàn toàn khác nhau với mỗi ứng dụng làm một cái gì đó khác nhau trên hoạt động dường như giống hệt nhau

đây là chỉ là một bản tóm tắt ngắn gọn về các vấn đề hàng đầu tôi đã có với Asterisk. Tôi tặng thời gian của tôi như là một coder, máy chủ của tôi để lưu trữ các kho CVS và phục vụ như là một thống chế lỗi và duy trì. Tôi tổ chức một cuộc gọi hội nghị lượt lập kế hoạch cho tương lai và giải quyết một số vấn đề tôi đã mô tả ở trên. Vấn đề là, khi một nhìn vào danh sách dài các thay đổi cơ bản, sau đó nghĩ về bao nhiêu công việc nó sẽ có và bao nhiêu mã có thể cần phải được xóa hoặc viết lại, các động lực đến địa chỉ các vấn đề bắt đầu mờ dần. Tôi có thể cho biết không nhiều người sẽ trên tàu với đề nghị của tôi để bắt đầu một chi nhánh 2.0 và ghi lại đoạn mã. Đó là lý do tại sao vào mùa hè năm 2005 tôi quyết định tôi sẽ làm điều đó bản thân mình.

tôi tập trung chủ yếu vào FreeSWITCH là bắt đầu từ lõi và bẫy tất cả các chức năng phổ biến dưới mui xe và tiếp xúc trong một kim tự tháp để các cấp cao hơn của ứng dụng. Giống như dấu sao, Các máy chủ Web Apache rất nhiều cảm hứng cho tôi và tôi đã chọn để sử dụng một thiết kế mô-đun. Từ ngày đầu tiên đã các nguyên tắc cơ bản cơ bản tôi đã chọn để tuân theo tất cả các kênh đã nó là của riêng chủ đề không có vấn đề gì nó đã làm và hội thoại đó sẽ sử dụng một chức năng máy nhà nước để điều hướng theo cách của mình thông qua cốt lõi. Điều này sẽ đảm bảo rằng tất cả các kênh sẽ làm theo cùng một đường dẫn dự đoán và bang móc và ghi đè có thể được đặt vào máy tính để thêm chức năng quan trọng rất tương tự như cách phương pháp và các công trình thừa kế lớp trong một đối tượng theo định hướng ngôn ngữ lập trình.

nó đã không được dễ dàng. Hãy để tôi cho bạn biết. Tôi đã có chia sẻ công bằng của phân khúc lỗi và Deadlocks tôi trong khi mã hóa FreeSWITCH, (nhiều hơn nữa của các cựu hơn sau này tôi phải nói). Nhưng tôi xây dựng mã từ lõi và đi từ đó. Kể từ khi tất cả các kênh hoạt động trong chủ đề riêng của họ và có là những dịp mà bạn cần phải tương tác với họ, Tôi sử dụng đọc/ghi khóa để các kênh có thể được đặt từ một thuật toán hashing chứ không phải là một danh sách liên kết và có là một tuyệt đối bảo đảm rằng các kênh không thể được truy cập hoặc biến mất trong khi một chủ đề bên ngoài có tham chiếu đến
đang được dịch, vui lòng đợi..
Kết quả (Việt) 2:[Sao chép]
Sao chép!
Làm thế nào để FreeSWITCH so sánh với Asterisk? Tại sao anh lại bắt đầu lại với một ứng dụng mới? Đây là những câu hỏi tôi đã được nghe rất nhiều thời gian gần đây vì vậy tôi quyết định để giải thích cho tất cả các chuyên gia điện thoại và những người đam mê cũng như những người quan tâm để biết làm thế nào hai ứng dụng so sánh và tương phản với nhau. Tôi có một số lượng lớn các kinh nghiệm với cả hai ứng dụng với khoảng 3 năm thực hiện phát triển dấu dưới thắt lưng của tôi và tốt, là tác giả của FreeSWITCH. Đầu tiên tôi sẽ cung cấp một ít lịch sử và kinh nghiệm của tôi với Asterisk, sau đó tôi sẽ cố gắng giải thích những động lực và phương pháp tiếp cận khác nhau tôi đã có FreeSWITCH. đầu tiên tôi đã cố gắng Asterisk trong năm 2003. Nó vẫn còn trước 1.0 và VoIP là vẫn còn rất mới với tôi . Tôi đã tải về và cài đặt nó và trong một vài phút, tôi đã được cù màu hồng trong giai điệu quay số phát ra từ điện thoại của tôi cắm vào mặt sau của máy tính của tôi. Tôi đã dành vài ngày tới chơi với kế hoạch quay số của tôi và kệ bộ não của tôi để suy nghĩ thứ mát mẻ tôi có thể làm với một chiếc điện thoại được nối với một máy tính Linux. Kể từ khi tôi đã thực hiện một số lượng rộng lớn của phát triển web trong cuộc sống quá khứ của tôi, tôi đã có tất cả các loại ý tưởng tiện lợi như phù hợp với người gọi id để số tài khoản của khách hàng và cố gắng đoán lý do tại sao họ đã kêu gọi vv Tôi cũng muốn di chuyển vào trong quay của tôi kế hoạch dựa trên mô hình kết hợp và bắt đầu hack mô-đun đầu tiên của tôi. Trước khi tôi biết điều đó tôi đã thực hiện cắt giảm đầu tiên của app_perl, bây giờ res_perl nơi tôi đã nhúng một thông dịch viên Perl5 trong Asterisk. Bây giờ tôi đã có ra khỏi hệ thống của tôi, tôi bắt đầu phát triển một cơ sở hạ tầng Asterisk định hướng để sử dụng cho hàng đợi cuộc gọi trong nước của chúng tôi . Tôi prototyped nó sử dụng app_queue và giao diện quản lý bây giờ tự hào gọi là "AMI" (viết tắt luôn luôn làm cho mọi việc mát âm thanh). Nó đã thực sự tuyệt vời! Bạn có thể gọi từ một số PSTN trên T1 và tham gia vào một hàng đợi cuộc gọi mà các đại lý của chúng tôi cũng gọi có thể phục vụ các cuộc gọi. "Điều này đá!" Tôi nghĩ đến bản thân mình khi tôi xem từ trang web ưa thích của tôi hiển thị tất cả các hàng đợi và những người đã được đăng nhập Nó thậm chí làm mới định kỳ bởi chính nó đã được lý do tại sao tôi đã rất ngạc nhiên khi biểu tượng nhỏ ở góc của trình duyệt của tôi là vẫn quay trong một thời gian. Đó là khi tôi lần đầu tiên nghe nó. Từ đó. Một trong tôi không bao giờ có thể quên, bế tắc. Đó là lần đầu tiên, nhưng nó không phải là cuối cùng. Tôi đã học được tất cả về chương trình gỡ rối GNU ngày hôm đó và đó chỉ là một trong nhiều sự cố. Bế tắc trong các ứng dụng hàng đợi. Bế tắc trong quản lý, tránh bế tắc trên giao diện điều khiển của tôi. Nó đã bắt đầu để có được với tôi một chút nhưng tôi vẫn tiếp tục. Bởi thời gian này tôi cũng khá quen thuộc với các phân khúc hạn Lỗi kẻ thù khác để phát triển máy tính. Sau thời gian khoảng một năm vật lộn với lỗi của tôi tìm thấy bản thân mình rất nhiều thành thạo ngôn ngữ lập trình C hơn tôi thậm chí tưởng tượng và gần Jedi kỹ năng tầm cỡ gỡ lỗi. Tôi đã có một nền tảng làm việc chạy một số dịch vụ trên một giá trị DS3 kênh TDM trải rộng trên 7 hộp dấu và tôi đã cho tấn mã cho dự án bao gồm một số toàn bộ các file trên mà tôi giữ bản quyền. http://www.cluecon.com/anthm.html Đến năm 2005, tôi đã khá nổi tiếng là một nhà phát triển dấu hoa thị. Họ thậm chí còn cảm ơn tôi trong cả hai tập tin TÍN DỤNG và trong cuốn sách, Asterisk, Tương lai của điện thoại. Tôi không chỉ có tấn của các ứng dụng cho dấu hoa thị trong cây, tôi đã có bộ sưu tập riêng của tôi về code họ không cần hoặc muốn trên trang web của riêng tôi. (Tuy nhiên hiện nay tại http://www.freeswitch.org/node/50) Mặc dù tất cả điều này tôi có thể không hoàn toàn thoát khỏi sự bế tắc và tai nạn. Tôi giấu vấn đề tốt với kịch bản khởi động lại và 7 cụm máy nhưng tôi không thể nhìn thấy một cách để mở rộng nền tảng của tôi nhiều hơn nữa. Tôi đã phải từ bỏ một số tính năng bởi vì họ chỉ sẽ không làm việc đúng dựa trên cách Asterisk được thiết kế. Asterisk sử dụng một thiết kế mô-đun nơi một tải lõi trung tâm chia sẻ đối tượng để mở rộng chức năng với các bit của mã được gọi là "mô-đun". Mô-đun được sử dụng để thực hiện các giao thức cụ thể như SIP, thêm các ứng dụng như IVRs tùy chỉnh và buộc trong giao diện bên ngoài khác như giao diện quản lý. Cốt lõi của Asterisk là một mô hình luồng nhưng rất bảo thủ. Kênh nguyên chỉ và các kênh truyền hình thực hiện một ứng dụng có chủ đề. Chân B của bất kỳ cuộc gọi chỉ hoạt động trong cùng một chủ đề như một chân và một cái gì đó khi xảy ra giống như một chuyển cuộc gọi kênh đầu tiên phải được chuyển sang một chế độ ren thường lần bao gồm một thực tế được gọi là kênh giả trang, một quá trình mà tất cả các ruột của một kênh bị rách từ một đối tượng bộ nhớ động và được đặt vào một. Một thực tế đã được một lần được mô tả trong mã nhận xét ​​là "khó chịu". Cùng đi cho các hoạt động ngược lại các chủ đề đã được loại bỏ bằng cách nhân bản các kênh và cho phép các ban hang-up mà cũng cần hack cấu trúc cdr để tránh nhìn thấy nó như là một cuộc gọi mới. Người ta thường sẽ thấy 3 hoặc 4 kênh cho một cuộc gọi duy nhất trong một chuyển cuộc gọi vì điều này. / * XXX Đây là một hoạt động nghiêm túc wacked ra. Chúng ta đang chủ yếu đưa ruột của kênh nhân bản vào kênh ban đầu. Bắt đầu bằng cách giết chết các ban phụ trợ của kênh. Tôi không chắc chắn chúng ta sẽ tiếp tục chức năng này, bởi vì trong khi các tính năng là tốt đẹp, chi phí là rất cao về nastiness tinh khiết. XXX * / Điều này đã trở thành cách thực tế để kéo một kênh ra khỏi nắm của một chủ đề và nguồn gốc của nhiều đau đầu cho các nhà phát triển ứng dụng. Chương trình luồng không chắc chắn này là một trong những yếu tố thúc đẩy cho một viết lại. Asterisk sử dụng liên kết-danh sách để quản lý các kênh truyền hình mở của nó. Một danh sách liên kết là một loạt các bộ nhớ động xích lại với nhau bằng cách sử dụng một cấu trúc có một con trỏ đến kiểu riêng của nó như là một trong những thành viên cho phép bạn ngừng chuỗi các đối tượng và theo dõi chúng. Họ thực sự là một thực hành lập trình hữu ích nhưng khi được sử dụng trong một ứng dụng ren trở nên rất khó quản lý. Người ta phải sử dụng mutexes, một loại đèn giao thông cho chủ đề để đảm bảo chỉ có 1 chủ đề bao giờ có quyền ghi vào danh sách hoặc bạn có nguy cơ một sợi rách một liên kết từ một danh sách khác, trong khi đang đi qua nó. Điều này cũng dẫn đến tình huống khủng khiếp mà một thread có thể được phá hủy hoặc giả mạo một kênh khác, trong khi đang truy cập vào nó mà sẽ dẫn đến một lỗi phân khúc đó là một lỗi nghiêm trọng trong chương trình và làm cho nó ngay lập tức ngăn chặn đó, tất nhiên có nghĩa là trong nhiều trường hợp tất cả các cuộc gọi của bạn sẽ bị mất. Tất cả chúng ta đã nhìn thấy dòng chữ: "Tránh bế tắc ban đầu" thông điệp mà chủ yếu là một nỗ lực để khóa một kênh 10 lần và nếu vẫn không khóa, chỉ cần đi trước và quên khóa. Giao diện quản lý hoặc AMI có một khái niệm mà ổ cắm được sử dụng để kết nối các khách hàng được truyền vào các ứng dụng để cho module của bạn có thể truy cập trực tiếp vào nó và về cơ bản viết bất kỳ dữ liệu bạn muốn mà ổ cắm trong các hình thức quản lý sự kiện mà không phải là rất có cấu trúc và do đó các giao thức là rất khó khăn để phân tích. lõi Asterisk đã liên kết phụ thuộc vào một số module của nó có nghĩa là ứng dụng sẽ không bắt đầu nếu một mô-đun nào đó không có mặt vì cốt lõi là thực sự sử dụng một số các mã nhị phân từ các mô-đun đối tượng chia sẻ trực tiếp. Để thực hiện cuộc gọi trong dấu trong ít nhất là phiên bản 1.2 bạn không có sự lựa chọn nhưng để sử dụng app_dial và res_features vì mã thực sự sống trong những mô-đun. Việc xử lý để thiết lập một cuộc gọi và làm những việc như quay số forked thực sự cư trú trong app_dial không phải là cốt lõi, và res_features thực sự có chức năng cấp cao nhất là cầu nối âm thanh. Asterisk không có bảo vệ của API của nó. Phần lớn các chức năng và cấu trúc dữ liệu được công khai và có thể dễ dàng bị lạm dụng hoặc bỏ qua. Cốt lõi là tình trạng hỗn loạn với các giả định về các kênh có một mô tả tập tin, mà không phải là luôn luôn cần thiết trong thực tế nhưng là bắt buộc đối với bất kỳ kênh dấu hoa thị. Nhiều thuật toán này được lặp đi lặp lại trong suốt mã những cách hoàn toàn khác nhau với mỗi ứng dụng làm một cái gì đó khác nhau về hoạt động dường như giống hệt nhau. Đây chỉ là một bản tóm tắt ngắn gọn về các vấn đề hàng đầu tôi đã có với Asterisk. Tôi dành thời gian của tôi như là một coder, máy chủ của tôi để lưu trữ các kho CVS và phục vụ như một soái lỗi và bảo trì. Tôi đã tổ chức một cuộc gọi hội nghị hàng tuần để lên kế hoạch cho tương lai và giải quyết một số vấn đề tôi đã mô tả ở trên. Vấn đề là, khi nhìn vào danh sách dài của những thay đổi cơ bản sau đó nghĩ về bao nhiêu công việc nó sẽ mất và bao nhiêu mã có thể phải được tẩy xóa hoặc viết lại, động lực để giải quyết các vấn đề bắt đầu mờ dần. Tôi có thể nói không nhiều người sẽ được trên tàu với đề nghị của tôi để bắt đầu một chi nhánh 2.0 và viết lại mã. Đó là lý do tại sao trong mùa hè năm 2005, tôi quyết định tôi sẽ làm điều đó bản thân mình. trọng tâm chính của tôi trên FreeSWITCH đã được bắt đầu từ lõi và bẫy tất cả các chức năng phổ biến dưới mui xe và phơi bày nó trong một kim tự tháp với cấp độ cao hơn của ứng dụng. Như Asterisk, Apache Web Server rất nhiều cảm hứng cho tôi và tôi đã chọn để sử dụng một thiết kế mô-đun. Từ ngày đầu tiên các nguyên tắc cơ bản cơ bản tôi đã chọn để tuân thủ được rằng tất cả các kênh có chủ đề riêng của nó không có vấn đề gì nó đã làm và chủ đề đó sẽ sử dụng một chức năng máy nhà nước để điều hướng theo cách của mình thông qua cốt lõi. Điều này sẽ đảm bảo rằng tất cả các kênh sẽ đi theo con đường và nhà nước có thể dự đoán tương tự móc và ghi đè có thể được đặt vào máy để thêm chức năng quan trọng rất giống với cách các phương pháp và các lớp kế thừa hoạt động trong một hướng đối tượng ngôn ngữ lập trình. Đó không phải là dễ dàng. Hãy để tôi nói cho bạn. Tôi đã chia sẻ công bằng của tôi về những lỗi phân khúc và bế tắc trong khi mã hóa FreeSWITCH, (nhiều hơn của cựu hơn sau này tôi phải nói). Nhưng tôi xây dựng mã từ cốt lõi và đi từ đó. Vì tất cả các kênh hoạt động trong chủ đề của riêng mình và có những dịp mà bạn cần phải tương tác với họ, tôi sử dụng đọc / ghi khóa để các kênh có thể được đặt từ một thuật toán băm chứ không phải là một danh sách liên kết và có một đảm bảo tuyệt đối kênh không thể được truy cập hoặc đi xa trong khi một thread bên ngoài có tham chiếu đến
































đang được dịch, vui lòng đợi..
 
Các ngôn ngữ khác
Hỗ trợ công cụ dịch thuật: Albania, Amharic, Anh, Armenia, Azerbaijan, Ba Lan, Ba Tư, Bantu, Basque, Belarus, Bengal, Bosnia, Bulgaria, Bồ Đào Nha, Catalan, Cebuano, Chichewa, Corsi, Creole (Haiti), Croatia, Do Thái, Estonia, Filipino, Frisia, Gael Scotland, Galicia, George, Gujarat, Hausa, Hawaii, Hindi, Hmong, Hungary, Hy Lạp, Hà Lan, Hà Lan (Nam Phi), Hàn, Iceland, Igbo, Ireland, Java, Kannada, Kazakh, Khmer, Kinyarwanda, Klingon, Kurd, Kyrgyz, Latinh, Latvia, Litva, Luxembourg, Lào, Macedonia, Malagasy, Malayalam, Malta, Maori, Marathi, Myanmar, Mã Lai, Mông Cổ, Na Uy, Nepal, Nga, Nhật, Odia (Oriya), Pashto, Pháp, Phát hiện ngôn ngữ, Phần Lan, Punjab, Quốc tế ngữ, Rumani, Samoa, Serbia, Sesotho, Shona, Sindhi, Sinhala, Slovak, Slovenia, Somali, Sunda, Swahili, Séc, Tajik, Tamil, Tatar, Telugu, Thái, Thổ Nhĩ Kỳ, Thụy Điển, Tiếng Indonesia, Tiếng Ý, Trung, Trung (Phồn thể), Turkmen, Tây Ban Nha, Ukraina, Urdu, Uyghur, Uzbek, Việt, Xứ Wales, Yiddish, Yoruba, Zulu, Đan Mạch, Đức, Ả Rập, dịch ngôn ngữ.

Copyright ©2025 I Love Translation. All reserved.

E-mail: