|By Ruth Willenborg, Gennaro Cuomo||
|January 8, 2003 12:00 AM EST||
IBM WebSphere Application Server (WAS) version 5.0 continues the tradition of improved performance from release to release. These improvements come from several key areas, which include:
- WAS's implementation of new J2EE 1.3 APIs, notably EJB 2.0
- Web services using SOAP
- Dynamic caching and edge componentry
- HTTP session management
- Extensions for the enterprise
WAS 5.0 supports the J2EE 1.3 programming model. The most significant area of performance advancement is within the EJB 2.0 portion of J2EE 1.3. There are two aspects of EJB 2.0 that support building higher-performing EJB-based applications: local interfaces and container-managed entities.
EJB 2.0 local interfaces provide optimized EJB-to-EJB access. By definition, EJB 2.0 local interfaces are local method calls that use call-by reference semantics. Unlike traditional EJB remote or "location-transparent" methods, local interface methods have no intramethod overhead and do not create copies of parameter or return objects. Lab measurements show a 20% to 2x improvement, depending on the size and complexity of parameters and/or return values.
Container-managed entities receive a boost in both usability and performance by allowing for container-managed relationships (CMR). CMRs define a relationship pattern between EJBs. Consider an application in which customers place orders. There is a relationship between customers and orders, in that every time the application accesses the Customer EJB, it also accesses the orders that a given customer has made. Furthermore, using the IBM WebSphere Studio tooling, you can define a read-ahead policy to improve the performance by preloading associated objects.
Figure 1 shows an association between customers and orders. The implementation is a CMR with one customer having many orders. A read-ahead hint on this relationship optimizes performance by preloading orders with the related customer in one generated SQL SELECT statement with a SQL JOIN for both underlying tables. This halves the number of database accesses for this logically related data. Using the read-ahead hint yielded a 10-15% performance improvement in lab measurements involving similar CMRs with 10 associated objects.
Base EJB 2.0 supports one read-ahead hint per association. WebSphere Application Server Enterprise Edition adds the capability to define multiple read-ahead hints per CMR relationship. This added capability is part of application profiling, discussed later in this article.
The most significant Web services performance optimization is in the SOAP support in the Web Services Technology Preview. In particular, the JAX-RPC, which is the standard programming interface to Web services, uses an optimized Apache Axis as the core of the WAS Web services stack. Early benchmarks on this base exhibit significant improvement in performance, depending on the complexity of the SOAP messages. This is illustrated in Figure 2, which shows a 2x improvement in throughput between WAS 4.0 and the WAS 5.0 Technology Preview. In this scenario SOAP messages containing a Java array containing 100 strings are exchanged between a Microsoft .NET client and WAS.
The new Axis implementation also allows for pluggable XML parsers following the Java API for XML Processing (JAXP) standard. By default, WAS configures the standard Xerces parser as the parser used for Web services. However, specialized parsers can be placed under JAXP to produce even better performance results for Web services. IBM is currently testing specialized parsers for future updates. Upgrading to a faster parser is transparent to the applications using Web services.
Dynamic Caching and Edge Components
The most efficient interaction is the interaction never done. This is the spirit of dynamic caching. WAS 5.0 introduces a powerful set of integrated cache-enabled APIs and services within the application server and Edge Server components, as shown in Figure 3. Utilizing these APIs and services can easily lead to doubling or tripling your application's performance.
WAS Caching Programming Model
WAS 5.0 allows for result caching of servlets/JSPs and CMP Entities and EJBs. Caching of SOAP responses for Web services and caching of command results (when using the com.ibm.websphere.command interface) are also supported. Resulting servlet/JSP fragments can also be cached on Edge Servers using Edge Side Includes (ESI) technology.
Result caching of servlet/JSP, EJB, and SOAP requests can be accomplished without the use of explicit caching APIs. Caching policies are described declaratively, using XML deployment descriptors. For example, the WebSphere Application Assembly Tool (AAT) is used to express how to cache and invalidate cached content. A Cache policy XML file, cachespec.xml, provides the caching metadata required by the dynamic caching service.
WAS Dynamic Caching Service
The runtime foundation for caching in WAS is the WebSphere dynamic caching service (Dynacache). Dynacache is a Java object cache that caches objects directly in WAS's (i.e., the JVM's) memory with the ability to "overflow" objects to disk to avoid over-utilizing memory. Using the Replication domain facility in WAS, results are optionally replicated across a cluster to avoid expensive regeneration on each server. Invalidation events to remove stale data from Dynacache are distributed using the same facility.
Contents in Dynacache can be shared with external caches, including the Caching Proxy Server (which is a WebSphere Edge Component), the IBM HTTP Server Cache Accelerator (HTTP kernel cache), or the WebSphere Web Server Plug-in (which plugs into most standard HTTP servers). These external caches support full-page caching of content generated by servlets/JSPs.
In addition, WAS 5.0 supports distributed fragment caching and assembly based upon the open ESI technology (www.esi.org). This enables WAS customers to improve delivery of personalized, dynamic Web content by exploiting ESI-capable "edge" servers, including the WAS Web server plug-in and in-network service providers such as Akamai. For example, with this powerful new feature, a page composed from a collection of servlets/JSPs (e.g., a portal-style page) can be assembled in the Web server from either cached or noncached components. By marking cached JSP/servlet results as "edgeable," using the assembly tool or by directly editing cachespec.xml, the corresponding cached results within Dynacache are copied into the plug-in memory (i.e., Web server).
WAS 5.0 is the industry's first J2EE application server to bundle edge-of-network functions specifically designed to add value to J2EE applications. The added functionality extends WebSphere's J2EE capabilities out into the network, placing content closer to the end user and enabling a richer Web site experience.
WebSphere version 5.0 Network Deployment introduces the Edge Components CD-ROM. This new offering concentrates the edge-of-network functions - which are typically deployed in a DMZ setting - into a single installable package.
Dispatcher is a general-purpose load balancer for routing and balancing of HTTP(s) requests entering into the enterprise. It is the point of entry into the data center, typically sitting in front of the Web server or proxy tier. Dispatcher monitors many aspects of the resources that are being load-balanced and dynamically adjusts the workload distribution, ensuring that traffic is routed to the most appropriate place as the load within the site changes.
For example, Dispatcher is used to distribute HTTP requests across a cluster of HTTP servers fronting WebSphere Application Servers. Using the Dispatcher technology typically provides near-linear scaling as servers are added to the cluster. In addition, the smart-routing capabilities within Dispatcher optimize workload distribution, using metrics such as CPU, as well as custom advisors sensitive to the actual performance of WebSphere applications.
In addition to the Dispatcher workload management capabilities, WebSphere includes workload management distribution between HTTP servers and Web containers, and EJB clients (including servlets) and EJBs. Version 5 now supports weighted workload distribution in addition to round-robin capabilities.
Caching Proxy provides the required functionality to front-end a cluster of WebSphere Application Servers. SSL termination, authentication, high-speed persistent caching, and intelligent routing functions are combined within a single network hop, thus alleviating the need to deploy multiple proxies that span multiple hops. Integration with Dynacache provides caching of servlet and JSP pages, while integration with Dispatcher technology and WebSphere's J2EE HTTP session provides optimized workload management and routing of stateful WebSphere sessions.
HTTP Session Management
One of the most performance-sensitive aspects of a J2EE application is the management of stateful applications. Application state is typically programmed using the servlet HTTP session APIs and managed using the WAS Session Manager. Managing such sessions in clustered configurations is one of the traditional value propositions of an application server. The WAS Session Manager capabilities allow choices between various degrees of performance and HTTP session data integrity (failover) in clustered environments.
The option with the best performance characteristics operates on a server affinity-based model without failover support. With this model, a front-end server (e.g., Web server/plug-in, caching proxy server, or Dispatcher) uses the JSession token generated by the Session Manager and typically stored in an HTTP cookie header to route requests to the particular server in the cluster that has the requester's session data.
WAS builds upon this model, adding failover support by backing up session data to a relational database. Affinity-based routing matches user requests to the servers containing their session data.When the application modifies the user's session data, an update is sent to the database in order to keep a fresh backup of the session. The backup version is used by another server in the cluster in the unlikely event of a failure in the server containing the session data. Though persisting HTTP session to a database is a very effective failover technique, some customers requested a lower-cost alternative that doesn't require a highly available database.
For this reason, WAS 5.0 offers the option to replicate HTTP session state in a cluster using a memory-to-memory data replication scheme. This scheme does not require a relational database. Instead it uses the Replication domain facility, a JMS-based, publish-and-subscribe model, to flexibly replicate data between servers in a cluster. (Remember, this is the same service that is used to replicate cached data and send cache invalidation events in WAS clusters.)
Within a replication domain, groups of servers are defined as being part of a replication group. A replication group can contain all servers within the cluster, a single "buddy," or some other arbitrary subcollection. An instance of WAS is configured as a replicator, acting as a message broker for the replication domain. Furthermore, a second replicator can be configured for availability purposes. This provides an efficient, flexible, standards-based mechanism for replicating session, without the need for added investment in relational database technologies.
The performance characteristics of persistent session, either shared through database or in-memory, are highly dependent on the size of the HTTP session object. Best practices advise keeping HTTP session objects small for optimum performance. Figure 4 shows the performance results for a cluster test using Ping Session, a servlet with a small HTTP session. In this test, only minimal performance impact is seen using in-memory replication across a five-node cluster.
WebSphere Application Server Enterprise
The WebSphere Application Server Enterprise Edition, available soon, offers programming model extensions to the base and Network Deployment editions of WAS. These extensions offer significant functional, productivity, and performance capabilities. Functional capabilities include process choreography (workflow) and dynamic query. Productivity capabilities include support for business rule beans, work area, and object pooling. This edition also offers opportunities for improving performance, scalability, and efficiency through application profiling, asynchronous beans, and other capabilities. Let's look specifically at the application profiling service and capabilities for startup and asynchronous beans.
The application profiling service enables deployment-time configuration techniques that enable your application to run more efficiently, with better scalability and performance. You can configure tasks that identify incoming requests, access intents that determine concurrency, and other data-access characteristics. Access intents enable you to specify data-access characteristics on a method-level basis. The application profiling function supports multiple access intents per method, optimizing access to the data for specific callers.
For example, some callers invoke a method with only the intent to read the data, while others can invoke the same method for read with intent to update. Using the application profiling service allows the programmer to develop a single method having different usage-based intents. Using a simple primitive test on a workload that is two-thirds read-intent, one-third read-for-update, the primitive runs three times faster with application profiling. This is compared to the same primitive if all accesses require a pessimistic read for update intent.
Startup and Asynchronous Beans
Enterprise adds a new set of APIs that allow J2EE applications to execute business logic when an application starts and when an application stops normally. For example, a startup bean can be used to warm up a CMP EJB cache by executing finder methods on the required entity beans. Startup beans also support asynchronous operations. The API set enables creation of a work object asynchronous bean to execute the cache warmup operation asynchronously from other work.
Asynchronous (async) beans also provide other parallel-processing mechanisms to an application. For example, writing log records to a database requires time to execute each logging transaction. Instead, the application writes logging records to a vector. Meanwhile, the async bean monitors the vector and writes the log records to the database. An example application using async beans to log such records shows a 2.5x improvement in the rate of logging.
Monitoring and Autonomic Optimization
WAS v5 extends the performance monitoring and tools capabilities of earlier releases. New capabilities include the Performance Advisor Technology Preview, offering tuning and configuration recommendations, as well as new performance monitoring data and interfaces. A brief overview is provided here, and a more detailed article, "Tuning WebSphere 5.0 Using the Performance Advisors" by Srini Rangaswamy and Carolyn Norton, is included in this issue.
New PMI Metrics and JMX Support
The Performance Monitoring Interface (PMI) is extended to provide additional performance data. In addition, all the performance data is now available through JMX interfaces (as well as the original PMI client APIs). For example, the new performance data includes persistent HTTP session size and JDBC read/write times. New performance modules for Dynacache, Workload Management, and the ORB (object request broker) were also added.
The Tivoli Performance Viewer can be used to view the PMI data. For example, an administrator can view the Dynacache cache hit rate on a given servlet or JSP.
Runtime Performance Advisor
A new technology preview provides warnings to the administrator for mistuned pools, queues, and caches. This advisor seamlessly integrates into the WAS runtime and is configured through the admin console. The advisor runs in the background, accesses PMI and configuration data, and exercises a set of tuning best practices. When the advisor detects tuning issues, a warning, along with advice, is generated to the admin console. For example, if the advisor detects a high discard rate on the prepared statement cache, a warning is generated recommending that the administrator increase the cache size.
Tivoli Performance Viewer Advisor
This technology preview integrates performance advice into the Tivoli Performance Viewer (TPV), formerly called Resource Analyzer. In this scenario, a tuning report is generated by the user's request, using the data collected by the TPV. A superset of the runtime advice is applied to the data, and the analysis report includes a set of tuning advice for modifying the settings on pools, queues, and caches.
Because this capability is integrated with the TPV, the reports are generated in real time during load testing or production. In addition, the TPV logging capabilities support running the report offline for analysis.
WAS 5.0 introduces a new type of performance data, request metrics. While the PMI provides average response times for servlets/JSPs within an application server and values for WAS runtime resources, request-based views of performance data are often valuable. Request metrics provides this data, tracking servlet, EJB, and JDBC entry and exit calls. As a request crosses JVM boundaries, a correlator is passed to allow end-to-end request timing. Request metrics is enabled for specific IP addresses or URLs. The data is logged to an Application Response Measurement (ARM) agent or the WAS logs.
Tools such as Tivoli Monitoring for Transaction Performance (TMTP) provide the ARM agents and produce end-to-end transaction monitoring reports. Request metrics is extremely powerful when enabled for the specific clients generating TMTP synthetic transactions. In this scenario, if a TMTP synthetic transaction shows a response-time spike, TMTP supports detailed transaction drilldown into the ARM data as shown in Figure 5.
Putting It All Together:
Trade3 Performance Benchmark
Trade3 is the third generation of the WebSphere performance benchmark and sample application, a highlight of the WebSphere performance site: www.ibm.com/software/webservers/ appserv/performance.html.
For WAS 5.0, Trade was redesigned to illustrate the significantly expanded programming model and new performance technologies. Trade3 provides a real-world workload, enabling performance research in J2EE 1.3 and Web services, including key WAS performance components and features. Trade3 builds on the fundamental established in Trade2, which is being used for performance research on a wide range of software components and platforms, including WebSphere, DB2, Java, Linux, and more.
Trade3, as shown in Figure 6, includes many of the new J2EE 1.3 and Web services features. New EJB 2.0 capabilities, including CMRs, local interfaces, and EJB Query Language, are exploited. Command-bean and fragment- caching techniques are leveraged. Trade3 also uses JMS and can be run in either synchronous or asynchronous, two-phase commit modes.
Trade3 performance results are collected in many configurations. Figure 7 shows comparisons of Trade3 in both synchronous and asynchronous modes. Two-phase commit performance is improved in version 5, and as you can see, the difference between one-phase commit and two-phase commit for Trade3 is quite small.
Trade3 also provides an excellent example implementation for Dynacache exploitation. The results show greater than 2x performance gains through Dynacache. Additional gains, up to 4x, depending on the workload mix, are obtained if ESI is also used.
WebSphere Application Server version 5.0 offers exciting new capabilities for developing high-performance, transactive, Web-based applications. Web sites. New functions, such as EJB 2.0 and Dynacache, provide opportunities for significant performance gains. The Edge components, in-memory session replication, and other new capabilities offer flexible, high-performing end-to-end deployment capabilities. These new performance capabilities, combined with new monitoring support, make version 5 the best platform for your Web site.
|bruce 01/13/03 08:43:00 PM EST|
I like more about IT information in Java Oracle ......or IBM .............................
An entirely new security model is needed for the Internet of Things, or is it? Can we save some old and tested controls for this new and different environment? In his session at @ThingsExpo, New York's at the Javits Center, Davi Ottenheimer, EMC Senior Director of Trust, reviewed hands-on lessons with IoT devices and reveal a new risk balance you might not expect. Davi Ottenheimer, EMC Senior Director of Trust, has more than nineteen years' experience managing global security operations and assessments, including a decade of leading incident response and digital forensics. He is co-author of t...
Nov. 27, 2014 01:00 PM EST Reads: 1,982
The 3rd International Internet of @ThingsExpo, co-located with the 16th International Cloud Expo - to be held June 9-11, 2015, at the Javits Center in New York City, NY - announces that its Call for Papers is now open. The Internet of Things (IoT) is the biggest idea since the creation of the Worldwide Web more than 20 years ago.
Nov. 27, 2014 01:00 PM EST Reads: 252
The Internet of Things will greatly expand the opportunities for data collection and new business models driven off of that data. In her session at @ThingsExpo, Esmeralda Swartz, CMO of MetraTech, discussed how for this to be effective you not only need to have infrastructure and operational models capable of utilizing this new phenomenon, but increasingly service providers will need to convince a skeptical public to participate. Get ready to show them the money!
Nov. 27, 2014 11:00 AM EST Reads: 1,785
The Internet of Things will put IT to its ultimate test by creating infinite new opportunities to digitize products and services, generate and analyze new data to improve customer satisfaction, and discover new ways to gain a competitive advantage across nearly every industry. In order to help corporate business units to capitalize on the rapidly evolving IoT opportunities, IT must stand up to a new set of challenges. In his session at @ThingsExpo, Jeff Kaplan, Managing Director of THINKstrategies, will examine why IT must finally fulfill its role in support of its SBUs or face a new round of...
Nov. 27, 2014 10:00 AM EST Reads: 1,805
One of the biggest challenges when developing connected devices is identifying user value and delivering it through successful user experiences. In his session at Internet of @ThingsExpo, Mike Kuniavsky, Principal Scientist, Innovation Services at PARC, described an IoT-specific approach to user experience design that combines approaches from interaction design, industrial design and service design to create experiences that go beyond simple connected gadgets to create lasting, multi-device experiences grounded in people's real needs and desires.
Nov. 27, 2014 08:00 AM EST Reads: 1,738
Enthusiasm for the Internet of Things has reached an all-time high. In 2013 alone, venture capitalists spent more than $1 billion dollars investing in the IoT space. With "smart" appliances and devices, IoT covers wearable smart devices, cloud services to hardware companies. Nest, a Google company, detects temperatures inside homes and automatically adjusts it by tracking its user's habit. These technologies are quickly developing and with it come challenges such as bridging infrastructure gaps, abiding by privacy concerns and making the concept a reality. These challenges can't be addressed w...
Nov. 27, 2014 07:45 AM EST Reads: 1,939
The Domain Name Service (DNS) is one of the most important components in networking infrastructure, enabling users and services to access applications by translating URLs (names) into IP addresses (numbers). Because every icon and URL and all embedded content on a website requires a DNS lookup loading complex sites necessitates hundreds of DNS queries. In addition, as more internet-enabled ‘Things' get connected, people will rely on DNS to name and find their fridges, toasters and toilets. According to a recent IDG Research Services Survey this rate of traffic will only grow. What's driving t...
Nov. 27, 2014 07:00 AM EST Reads: 1,970
Connected devices and the Internet of Things are getting significant momentum in 2014. In his session at Internet of @ThingsExpo, Jim Hunter, Chief Scientist & Technology Evangelist at Greenwave Systems, examined three key elements that together will drive mass adoption of the IoT before the end of 2015. The first element is the recent advent of robust open source protocols (like AllJoyn and WebRTC) that facilitate M2M communication. The second is broad availability of flexible, cost-effective storage designed to handle the massive surge in back-end data in a world where timely analytics is e...
Nov. 27, 2014 06:45 AM EST Reads: 1,923
Scott Jenson leads a project called The Physical Web within the Chrome team at Google. Project members are working to take the scalability and openness of the web and use it to talk to the exponentially exploding range of smart devices. Nearly every company today working on the IoT comes up with the same basic solution: use my server and you'll be fine. But if we really believe there will be trillions of these devices, that just can't scale. We need a system that is open a scalable and by using the URL as a basic building block, we open this up and get the same resilience that the web enjoys.
Nov. 27, 2014 06:45 AM EST Reads: 2,048
We are reaching the end of the beginning with WebRTC, and real systems using this technology have begun to appear. One challenge that faces every WebRTC deployment (in some form or another) is identity management. For example, if you have an existing service – possibly built on a variety of different PaaS/SaaS offerings – and you want to add real-time communications you are faced with a challenge relating to user management, authentication, authorization, and validation. Service providers will want to use their existing identities, but these will have credentials already that are (hopefully) i...
Nov. 27, 2014 04:00 AM EST Reads: 1,610
"Matrix is an ambitious open standard and implementation that's set up to break down the fragmentation problems that exist in IP messaging and VoIP communication," explained John Woolf, Technical Evangelist at Matrix, in this SYS-CON.tv interview at @ThingsExpo, held Nov 4–6, 2014, at the Santa Clara Convention Center in Santa Clara, CA.
Nov. 27, 2014 04:00 AM EST Reads: 1,635
How do APIs and IoT relate? The answer is not as simple as merely adding an API on top of a dumb device, but rather about understanding the architectural patterns for implementing an IoT fabric. There are typically two or three trends: Exposing the device to a management framework Exposing that management framework to a business centric logic Exposing that business layer and data to end users. This last trend is the IoT stack, which involves a new shift in the separation of what stuff happens, where data lives and where the interface lies. For instance, it's a mix of architectural styles ...
Nov. 26, 2014 11:30 PM EST Reads: 1,817
Cultural, regulatory, environmental, political and economic (CREPE) conditions over the past decade are creating cross-industry solution spaces that require processes and technologies from both the Internet of Things (IoT), and Data Management and Analytics (DMA). These solution spaces are evolving into Sensor Analytics Ecosystems (SAE) that represent significant new opportunities for organizations of all types. Public Utilities throughout the world, providing electricity, natural gas and water, are pursuing SmartGrid initiatives that represent one of the more mature examples of SAE. We have s...
Nov. 26, 2014 06:00 PM EST Reads: 1,713
P2P RTC will impact the landscape of communications, shifting from traditional telephony style communications models to OTT (Over-The-Top) cloud assisted & PaaS (Platform as a Service) communication services. The P2P shift will impact many areas of our lives, from mobile communication, human interactive web services, RTC and telephony infrastructure, user federation, security and privacy implications, business costs, and scalability. In his session at @ThingsExpo, Robin Raymond, Chief Architect at Hookflash, will walk through the shifting landscape of traditional telephone and voice services ...
Nov. 26, 2014 02:00 PM EST Reads: 1,975
The Internet of Things is tied together with a thin strand that is known as time. Coincidentally, at the core of nearly all data analytics is a timestamp. When working with time series data there are a few core principles that everyone should consider, especially across datasets where time is the common boundary. In his session at Internet of @ThingsExpo, Jim Scott, Director of Enterprise Strategy & Architecture at MapR Technologies, discussed single-value, geo-spatial, and log time series data. By focusing on enterprise applications and the data center, he will use OpenTSDB as an example t...
Nov. 25, 2014 09:30 PM EST Reads: 2,083
Explosive growth in connected devices. Enormous amounts of data for collection and analysis. Critical use of data for split-second decision making and actionable information. All three are factors in making the Internet of Things a reality. Yet, any one factor would have an IT organization pondering its infrastructure strategy. How should your organization enhance its IT framework to enable an Internet of Things implementation? In his session at Internet of @ThingsExpo, James Kirkland, Chief Architect for the Internet of Things and Intelligent Systems at Red Hat, described how to revolutioniz...
Nov. 24, 2014 07:00 PM EST Reads: 2,189
Bit6 today issued a challenge to the technology community implementing Web Real Time Communication (WebRTC). To leap beyond WebRTC’s significant limitations and fully leverage its underlying value to accelerate innovation, application developers need to consider the entire communications ecosystem.
Nov. 24, 2014 12:00 PM EST Reads: 1,920
The definition of IoT is not new, in fact it’s been around for over a decade. What has changed is the public's awareness that the technology we use on a daily basis has caught up on the vision of an always on, always connected world. If you look into the details of what comprises the IoT, you’ll see that it includes everything from cloud computing, Big Data analytics, “Things,” Web communication, applications, network, storage, etc. It is essentially including everything connected online from hardware to software, or as we like to say, it’s an Internet of many different things. The difference ...
Nov. 24, 2014 11:00 AM EST Reads: 2,288
Cloud Expo 2014 TV commercials will feature @ThingsExpo, which was launched in June, 2014 at New York City's Javits Center as the largest 'Internet of Things' event in the world.
Nov. 24, 2014 09:00 AM EST Reads: 2,148
SYS-CON Events announced today that Windstream, a leading provider of advanced network and cloud communications, has been named “Silver Sponsor” of SYS-CON's 16th International Cloud Expo®, which will take place on June 9–11, 2015, at the Javits Center in New York, NY. Windstream (Nasdaq: WIN), a FORTUNE 500 and S&P 500 company, is a leading provider of advanced network communications, including cloud computing and managed services, to businesses nationwide. The company also offers broadband, phone and digital TV services to consumers primarily in rural areas.
Nov. 23, 2014 07:30 PM EST Reads: 2,264