View
1.897
Download
3
Category
Tags:
Preview:
DESCRIPTION
Slides from a talk at the Erlang Montreal user group.
Citation preview
Erlang at Nu EchoSome lessons learned
Dominique Boucher Dominique Boucher Nu Echo
Agenda
Who we are, what we doWho we are, what we doNuGram Hosted ServerWhy ErlangArchitectureSome lessons
Who we are / what we do
• Speech applicationsSpeech applications expertsLots of R&D• Lots of R&D
• Many tools to support our own practice• Grammar tools• Benchmarking/tuning tools• Testing/monitoring toolsTesting/monitoring tools
Some of our tools
NuBot
NuGram IDE
NuGram Hosted Server
Hosted infrastructure for deploying andHosted infrastructure for deploying and sharing speech grammars– Supports static AND dynamic grammars– Supports static AND dynamic grammars– Embeds the NuGram technologies
• Dynamic grammar instantiation• Dynamic grammar instantiation• Grammar conversion to ABNF/GrXML/GSL• Text-based semantic interpretationp
• To complement telephony in the cloudTo complement telephony in the cloud(eg. Tropo)
NuGram Hosted Server
ComponentsRESTf l API– RESTful API– www.grammarserver.com/api
C it b it– Community website– www.grammarserver.com
– NuGram product website– nugram.nuecho.com
NuGram Hosted Server
NuGramHosted Server
Your application
(Java Ruby PythonHosted Server (Java, Ruby, Python, JavaScript, Erlang, etc.)
TelephonyPlatform
NuGram Hosted ServerAn example in Ruby
dyngrammar = "#ABNF 1.0 UTF-8;..."
server = GrammarServer.new()session = server.create session("username", "passwrd")session server.create_session( username , passwrd )session.upload("digits2.abnf", dyngrammar);grammar = session.instantiate("digits2.abnf", {})interpretation
i t t(' t th f ') t j= grammar.interpret('one two three four').to_jsonsession.disconnect
Why Erlang?
• Initial requirementsInitial requirements• High-performance HTTP server
• Scalability Fault tolerance• Scalability, Fault-tolerance
• Hot code swapping
Di t ib t d d t b• Distributed database
• The Erlang appeal• Single language, single platform
• Ideal projectp j• for experimenting with a different technology
Components• Behaviours for building robust
applications• Behaviours for building robust
applicationsOTP
(Open Telecom Pl tf ) applicationsapplicationsPlatform)
• High performance HTTP Server• High performance HTTP ServerYaws • High-performance HTTP Server• High-performance HTTP ServerYaws
• Distributed, fault-tolerant, soft realtime DB
• Distributed, fault-tolerant, soft realtime DBMnesia
• Java API to expose Java/Kawa code as a regular Erlang node
• Java API to expose Java/Kawa code as a regular Erlang nodeJinterface
High-level architecture
JInterface JInterface JInterface
www.grammarserver.com(http + https)
Yaw
s
nugram.nuecho.com(http + https) Y
MnesiaRESTful API(http + https)
Session handlingJava/Kawa Worker
Java/Kawa WorkerJava Thread
Erlang Node
Ja a ead
Session
Dispatcher
Mne
sia
Yaws
Dispatcher
Request Response
Session handlingJava/Kawa Worker
Java/Kawa WorkerJava Thread
Erlang NodeErlang Node
Ja a eadca
ted)
Session
cate
d)
Dispatchersia
(rep
lic
DispatcherDispatcher sia
(rep
lic
Yaws
Dispatcher
Mne
s
Yaws
Dispatcher
Yaws
Dispatcher
Mne
s
Request Response
Session handling
• Sending messages to remote nodes isSending messages to remote nodes is completely transparentE l ( i lifi d)Example (simplified)
Process = db:get session(SessionID)Process = db:get_session(SessionID),Process ! Request.
Session handling
• Session timeouts handled by theSession timeouts handled by the session processE lExample
receive…
after Timeout ->db:expire_session(self())
end
Mnesia
• StoresStores…• User accounts• All grammars
(templates and instantiated ones)• Node IDs of all Java workers• All session data
What we’ve developed
Account management Registration, email confirmation, etc.
BBcode validation & conversion for comments
Twitter widgetA process caches the tweetsA process caches the tweets and updates it every 5 minutes
Rendering of tweetse de g o ee s
RSS reader / widgetA process caches the feed contentA process caches the feed content and updates it every hour
What we’ve developed
Code-based representation pof the web site structure
Tree like structureTree-like structureDocuments, modules, sections
Supports the addition on new “modules”
Lots of unit tests!
Web site structure
-define(SITE_CONFIGURATION,{ i d{section, "product_app", "Home",[{module, "welcome",
"Welcome - NuGram Platform", {nugram_site, welcome_with_news, []}},
{document, "system_error", "Warning - Request not completed","system_error.html"},
{section, "nugram_platform", "NuGram Platform",[{document, "overview",
"Overview", "nugram_overview.html"},
{document, "faq", "FAQ", "faq.html"},{ , q , , q },{document, "abnf_tutorial",
"Grammar Language Tutorial", "abnf_tutorial.html"},
……
Lessons learned
• Erlang strengths • Glueing things togetherg g g• Data transformations
• bbcode XML• bbcode, XML
• Protocol handling / processing byte streamsstreams
• Like encoding detection
G t d i d l t i t• Great dynamic development environment• REPL + connecting to a running node
Lessons learned
E l k• Erlang weaknesses• Sequential computations
harder to express• A matter of style
• String manipulationg p• Somewhat better now (support for encodings)
Lessons learned
• Learn and use OTP from day one• Servers,
supervisors,applicationsapplications
• Worth the investment
E l t itt f d• Example: twitter feed server• First version without OTP
crashed way too often making the platform unreliable• crashed way too often, making the platform unreliable
• Second version using gen_server
Lessons learned
• Dynamically-typed languages makeDynamically typed languages make non-trivial refactorings difficult and error-proneerror-prone• Not specific to Erlang,
b t litbut a reality• Dializer can help
• Hot code loading is greatHot code loading is great• But tricky to do right
Lessons learned
• Know your toolsKnow your tools• Toolbar, tv,
appmon, pmanpp , p
D 't i t th h l• Don't reinvent the wheel• There are a lot more libraries now
• we use Yaws, oauth, smtp_fsm
• rebar - great build tool
We learned a lot!
And we had a lot of fun()!()
halt()halt().
Recommended