[asterisk-users] Experience with Vicidial
Alex Balashov
abalashov at evaristesys.com
Thu Jul 17 02:59:12 CDT 2008
Matt Florell wrote:
> No apologies necessary, I think a lot of what you said is mostly true.
Well, thank you. I really appreciate that you're willing to entertain
what I am saying without construing it as some sort of attack; it is
not in the least bit intended that way.
> The PHP and Perl code is not the prettiest around, and a lot of it is
> not commented or formatted as well as it should be. However, I would
> disagree that there is absolutely zero regard for maintanability or
> readability. As with many other GPL projects out there VICIDIAL is
> free to use and modify, and there are many people outside of our
> company who have worked with the code to provide patches and added
> functionality.
Indeed, and I acknowledge that this is a challenge with an open-source
project - a problem that is probably best solved by means that are not
necessarily received well politically, and is probably seen as
orthogonal to the spirit and philosophy of open-source. It requires
some degree of centralisation of the patch management process and high
standards for acceptance, testing, and coding conventions. This leads
to a process that gives the perception of being more "closed," a la the
Linux kernel, and, as some would have it, perhaps the Asterisk source
tree. (I can't really say, as I've never attempted to contribute any of
my modifications of the Asterisk source to the project. *hangs head in
shame*)
But, maintainability and extensibility are probably the biggest
challenges to the adoption of an open-source project by a commercial
organisation, although those challenges are even more formidable for
proprietary, closed-source products. The stark, naked economic
realities of adopting something are still there.
The integration paths, APIs, transparency, modularity and extensibility
are the most important central concerns. For instance, many likely use
cases of ViciDIAL entail at least some degree of integration with
existing business systems, rules, and logic; after all, the data that
goes into the hopper must come from somewhere. :-)
... Which leads me to my point: contrary to what is often zealously
claimed by purveyors and advocates of open-source solutions, the simple
fact that the code is open **does not, ipso facto, offer the necessary
level of integration and extensibility.** Version changes, feature
changes, bug fixes, and other revisions cannot be readily or easily
applied if an organisation chooses to essentially "fork" an internal
revision of stock code, so invariably the preoccupation of good
engineering project management becomes whether the custom code can be
kept "outboard" in modules entirely separate from the main code tree, so
that the latter can remain more or less pristine across upgrades,
updates, add-ons, etc.
This is where the importance of data import/export, APIs, and other
integration paths comes in. It's the same reason why Asterisk worked
out so well for you in creating ViciDIAL; you can do pretty much
everything in AGI, instead of having to hack the source or even do a
whole lot in the configs.
And, of course, in closed-source situations, these integration paths
become the lifeline - the only possible path for integration and
customisation. So, these access points to the "plumbing" of the
program, where tweaks can be made to the nature and content of its flow,
are extremely vital.
ViciDIAL doesn't really have these, as far as I can tell.
> The 50,000+ lines of code were mostly written by me over the course of
> 5 years, and as we are now having more people working on the code and
> we are going through the scripts we are working to make the code
> easier to understand. It is important to mention that VICIDIAL is
> quite complex and offers a lot of features that add to the complexity
> of the code. Many of these features were not even conceived when the
> project was started so they were added in in the most efficient manner
> that was available. At this point there are over 1000 database fields
> across 60+ tables that control how VICIDIAL works.
Yeah, I understand. It's just how the project evolved; I'm sure when
it was started it was intended to perform a relatively narrow subset of
what it does now, and things just got added on. Nothing wrong with that
intrinsically; it's how many open source projects got their beginnings,
and hardly to their detriment.
Still, the ViciDIAL code is an example of something that appears to have
been written, but not really designed, engineered, or orchestrated. As
the complexity increases in the manner you describe above, it is
critically important to be able to decompose new elements out of the
core and into modules, libraries, packages, etc. And good developer
documentation for the interfaces to these things must be crafted. The
thinking must become a lot less "linear" in order for the
maintainability and economic feasibility of the code to scale
correspondingly to the features on the functional veneer of the application.
As a somewhat related note, a lot of the constructs used in the code are
simply naive, from a programmatic perspective. At this level of
complexity, the code should feel like it belongs to an application,
instead of a very, very complicated script.
But worst of all is the organisation and readability. I've worked to
evaluate the adoption of ViciDIAL with three different organisations
now, suggesting it with professional impartiality - apart from the
advocacy inherent in simply recommending it. Each time, I would say a
genuine, sincere, diligent effort was made by the developers to get to
understand the code and explore how to go about customising it, and in
each case the code was ultimately judged too spaghetti to be workable.
The general complaints were - (1) impossible to read (2) strangely and
inconsistently formatted (3) lack of modularisation, abstraction,
centralisation, and other vital architectural considerations.
> As for scalability, VICIDIAL scales to hundreds of seats across
> multiple Asterisk servers. It can do this because of it's reliance on
> the MySQL database that acts as the core of a VICIDIAL system. We
> chose to use MySQL instead of a dedicated communications protocol so
> that the data could be accessed and used by almost any programming or
> user interface, and still remain extremely fault-tolerant and
> resistant to issues on any individual system.
This is advantageous and portable, but a database really should not be
used for a high-speed, high-volume IPC mechanism inherently. That's not
what databases are for.
Secondly, I think that a lot of the need for such a mechanism arises
from the fact that ViciDIAL is driven by so many concurrent processes
and cron jobs; it ends up being a surrogate for locking and IPC.
Of course, this is just my opinion, but I think the dialer component of
ViciDIAL (i.e. the AGI part) could benefit from a much more monolithic
approach involving multiple threads and a great deal more synchronous
I/O and event multiplexing. This would eliminate a lot of the need to
pump so much data in and out of the database for the purpose of
maintaining synchronisation in the first place.
Also, you don't necessarily have to develop a custom IPC protocol for
communication amongst components; there are plenty of workable
distributed service architectures out there.
> As for efficiency, yes there are a lot of small inefficiencies in the
> code, but most of the major bottlenecks were removed after changing
> many AGI scripts to FastAGI and rewriting several other scripts, which
> resulted in a 70-80% reduction in non-Asterisk load on a VICIDIAL
> system.
Ah, well, glad to hear it!
It's been a while now, but I saw a main issue to be a lot of redundant
and unnecessary database calls in dozens of different places.
In a lot of cases, what ViciDIAL's AGI scripts appear to do is:
1. Get data out of database;
2. Somehow programmatically transform the data (i.e. do something with
it in a Perl %hash, or sort it in an array);
3. Feed the data out of the programmatic construct back into the database.
4. Do more things with it there.
5. Get it back out of the database and do some more stuff with it in the
program.
6. Rinse, repeat.
Sometimes this is unavoidable, and also, MySQL's abysmal lack of decent
features prior to 5.x might have been another constraint. For instance,
without supporting sub-queries, one doesn't have a lot of choice in many
cases except to get the data out, and use parts of it as identifiers for
other queries.
All the same, a lot of this stuff could be done with stored procedures,
more joins, and other good, judicious use of in-database facilities.
There is also a dire need for centralisation of a lot of the database
calls. On more than one occasion while monkeying around with ViciDIAL I
discovered that to make some minor adjustments to the schema and data
treatment, I had to make changes in dozens of places across 15-20 files.
> Javascript and XMLHTTPRequest are wonderful in some
> ways, but are very hard to work with in a complex application like
> VICIDIAL and they are not the most efficient solution despite all of
> their advantages of client portability and
> zero-installation/configuration.
Ain't that the truth. :-)
> We would love to hear more about the specific issues that you found
> working with VICIDIAL, if you could email me back or just post them to
> the VICIDIAL forum or Issue Tracker.
I would, but a lot of my issues are philosophical and relate to broad
project management / business considerations rather than extremely
specific, well-defined lackings.
> Could you tell me what the last version of VICIDIAL that you worked with was?
I do not recall. It was whatever was current and stable in January 2008.
-- Alex
--
Alex Balashov
Evariste Systems
Web : http://www.evaristesys.com/
Tel : (+1) (678) 954-0670
Direct : (+1) (678) 954-0671
Mobile : (+1) (706) 338-8599
More information about the asterisk-users
mailing list