Neel Shah, VP Software Development
May 23, 2024
At Strasz Assessment Systems, our ongoing cloud migration initiative for the internal systems of the AICPA Exams Team has led us to re-architect our infrastructure using principles aligned with modern service-oriented design. Leveraging Azure Functions, Azure Service Bus, Azure App Service, and Azure Cognitive Search, we aimed to create a scalable, flexible, and resilient system. This post explores this key aspect of our migration, highlighting the challenges we faced, the strategies we employed, and the benefits we’ve realized.
Background
Our legacy infrastructure was a blend of traditional and distributed architectures. We relied on dedicated servers to host monolithic applications, including our search capabilities. For messaging, we used RabbitMQ to manage workflows across distributed applications. Although robust, these systems were difficult to scale and had trouble adapting to our growing and changing needs.
Search was a significant pain point due to our dependence on dynamic SQL queries for search operations. These queries were often slow, complex to manage, lacked necessary scalability, and hindered our ability to innovate rapidly and efficiently.
Our Goals
The cloud migration journey afforded us the opportunity to select a modern cloud-based architecture with the following key objectives:
- Scalability: We needed our systems to handle varying and often growing loads seamlessly, especially during peak periods of result processing.
- Flexibility: Adapting quickly to changes in exam content, regulatory requirements, and technological advancements required more adaptable systems.
- Resilience: Ensuring continuous availability and minimizing the impact of individual component failures on the overall system was crucial to maintaining the integrity of the exam content authoring and scoring processes.
- Reusability: Creating modular components that could be reused across different processes would increase efficiency, reduce redundancy, and streamline our operations.
Transitioning to Azure Services
We integrated several Azure services that aligned well with our goals:
Azure Functions: Event-Driven Microservices
Azure Functions is a serverless compute service that enables you to run event-driven code without having to explicitly provision or manage infrastructure. It allowed us to create microservices that react to various triggers, such as messages from Azure Service Bus or Timers. This event-driven model is central to our new architecture, where services need to operate independently and respond to specific events.
Key benefits include:
- Automatic scaling: Functions can scale automatically based on demand, ensuring that each service can handle its workload without manual intervention.
- Focus on business logic: By abstracting server management, Azure Functions allowed us to focus on developing business logic rather than infrastructure maintenance, reducing overhead and accelerating deployment.
Example Scenario: Before migrating to Azure Functions, our on-premises monolithic system required numerous clever tricks and approaches to optimize performance during peak loads of result processing. However, these methods had reached their limits, and our setup had multiple single points of failure. With automatic scaling, we can now handle these peaks seamlessly, ensuring timely processing, increased resilience, and reduced downtime.
Azure Service Bus: Reliable Messaging Backbone
Azure Service Bus is a fully managed enterprise message broker that supports message queues and publish-subscribe topics, enabling asynchronous messaging between services.
NServiceBus is a popular framework that sits on top of Azure Service Bus, offering advanced features like sagas for long-running workflows, message retries, and error handling.
Together, they improve system resilience, flexibility, reliability, and maintainability by ensuring loose coupling and allowing services to communicate without direct dependencies.
Key benefits include:
- Reliable message delivery: Ensures messages are delivered reliably and can handle complex routing scenarios.
- Decoupling services: Helps isolate failures and ensures messages are processed reliably, contributing to the overall resilience of the system.
Technical Detail: We leveraged distributed tracing, supported by both the Azure platform and NServiceBus, to monitor message flow and debug issues, significantly improving our system’s reliability and maintainability. For more on distributed tracing, refer to Jimmy Bogard’s primer on diagnostics and tracing.
Azure App Service: Managed Web Application Hosting
Azure App Service is a fully managed platform for building, deploying, and scaling web apps. It supports multiple programming languages and frameworks, simplifying deployment and management.
Key benefits include:
- Automatic scaling: Handles increased traffic and ensures high availability, aligning with our need for a scalable and reliable infrastructure.
- Integration with Azure services: Seamlessly integrates with other Azure services, allowing us to create comprehensive, connected solutions that support our business processes.
User Impact: Users have reported significant improvements in system responsiveness. According to the AICPA Exams Team, the improved reliability and performance of our web applications have significantly enhanced their productivity and user experience.
Azure Cognitive Search: Advanced Search Capabilities
Azure Cognitive Search is a search-as-a-service solution that provides powerful search capabilities over large datasets. It goes beyond traditional SQL queries by enabling semantic search, which improves the relevance and accuracy of search results.
Key benefits include:
- Scalability: Can handle growing volumes of unstructured data typical in a modern system.
- Semantic search: Enhances search results by understanding the context and meaning of search queries, providing more relevant and accurate results.
Example Scenario: Previously, our search functionality was often slow and required extensive SQL gymnastics to optimize. It was also limited to keyword matching, which often did not yield the most relevant results. With Azure Cognitive Search, our search operations are now faster and more accurate, significantly enhancing the user experience.
Challenges and Solutions
Implementing our new architecture with these Azure services presented several challenges, which we addressed with specific strategies:
Service Integration: Ensuring seamless interaction between services required careful design and coordination. We leveraged distributed tracing and logging to track the flow of requests and troubleshoot issues across multiple services, providing valuable insights into system performance and dependencies.
- Data Consistency: Implementing eventual consistency requires a learning curve and can take time for development teams to fully internalize. However, it offers significant benefits in terms of system scalability and availability. By understanding and managing eventual consistency, we were able to build a more resilient and performant system.
- Being at the Bleeding Edge: Adopting cutting-edge technology sometimes meant waiting for the ecosystem to mature. While we benefited from the latest features and capabilities, we also faced challenges related to stability and support. This required us to be adaptable and ready to implement workarounds as the technology evolved.
- Cold Start Latency: Serverless functions can experience latency during the initial start if they haven’t been used recently, known as “cold starts.” To mitigate this issue with Azure Functions, options include using premium plans or hosting them in the same App Service plan as web applications, depending on specific needs and workloads.
- Data Migration: Migrating data from our existing SQL-based system to Azure required careful planning and execution to ensure data integrity and minimize downtime.
Key Benefits Realized
The adoption of Azure services within our new architecture as part of our cloud migration has delivered significant benefits:
Enhanced Resilience: The combination of Azure Service Bus and NServiceBus ensures that our system is resilient to failures. Messages are reliably delivered, and services can recover from errors without manual intervention.
- Improved Flexibility: By decoupling services and leveraging event-driven processing, we can update and deploy individual components without affecting the entire system, making it easier to adapt to changes.
- Scalability: Both Azure App Service and Azure Functions scale automatically to handle increased traffic and processing loads, ensuring seamless scalability as our organization grows.
- Cost Efficiency: The serverless model allows us to pay only for the compute resources we use, optimizing cost efficiency for event-driven workloads.
- Advanced Search Capabilities: Azure Cognitive Search provides powerful search functionalities and real-time insights, greatly enhancing our search operations and user experience.
- Task Based UI: The transition to a Task-Based UI in our new architecture has greatly simplified user interactions. In our previous monolithic system, users had to navigate through complex interactions to complete tasks like approving an item. The Task-Based UI, however, focuses on specific user actions, making the system more intuitive and user-friendly.
- Operational Efficiency: The combination of these Azure services has reduced the operational burden on our IT team. By leveraging managed services like Azure App Service, automated scaling with Azure Functions, and efficient messaging with Azure Service Bus, we can focus more on innovation and less on maintenance.
Conclusion
The integration of Azure Functions, Azure Service Bus, Azure App Service, and Azure Cognitive Search represents a significant milestone in our cloud migration journey, enhancing our system’s scalability, flexibility, and resilience. These strategic choices meet our current operational needs and position us for future growth and innovation in the cloud.
As we continue to evolve, we will refine our architecture, explore new Azure capabilities, and maintain our commitment to delivering high-performance, reliable, and innovative solutions for the AICPA Exams Team. This journey underscores the importance of strategic planning, continuous learning, and embracing change for future success.
About the Author
Neel Shah is a seasoned technology leader passionate about driving innovation and delivering exceptional software solutions. As the Vice President of Software Development at Strasz Assessment Systems, Neel brings a wealth of experience in leading high-performing teams, shaping strategic initiatives, and fostering a culture of excellence. With more than two decades immersed in the technology sector, Neel has developed a deep understanding of distributed systems and Service-Oriented Architecture. This expertise enables him to spearhead the creation of scalable, resilient software solutions tailored to meet the dynamic needs of clients and stakeholders, underpinned by pragmatic technology choices. By fostering a culture of innovation and continuous improvement, Neel empowers teams to push the boundaries of what’s possible and deliver impactful results that drive business growth. In his leisure time, Neel enjoys quality moments with his wife and two boys, playing cricket, watching movies, and staying updated on the latest developments in science and technology.
John DeFalco, SR Software Engineer
August 6th, 2021
Ken White is a Scrum Master for one of our Agile development teams. He’s also our Production Support Operations Manager for the same customer. I don’t believe combining these roles is a practice unique to Strasz. What really sets Ken apart from most others is, he is also currently the Fire Chief for the Liberty Corner Volunteer Fire Department1. So, it goes without saying that Ken has both an educational background and practical experience to bring teams of people together with a high likelihood of success. We’ve all heard of the chicken and egg paradox. So was the fire department the chicken and his college degree the egg? Or vice versa?

Ken (left) alongside the Chief (middle) and Deputy Chief (right) of the Liberty Corner Volunteer Fire Department.
Ken White is a Scrum Master for one of our Agile development teams. He’s also our Production Support Operations Manager for the same customer. I don’t believe combining these roles is a practice unique to Strasz. I’m sure there are plenty of other leaders in the field that are holding down both positions. What might be rarer, Ken has a degree in Management Information System & Operations Management that almost exactly aligns with his current job responsibilities. What really sets Ken apart from most others is, he is also currently the Fire Chief for the Liberty Corner Volunteer Fire Department1. So, it goes without saying that Ken has both an educational background and practical experience to bring teams of people together with a high likelihood of success. We’ve all heard of the chicken and egg paradox. So was the fire department the chicken and his college degree the egg? Or vice versa?
James Lipton from The Actor’s Studio is often fond of saying, “Let’s start at the beginning.” Back in the summer of 1986, Ken was working as a lifeguard and snack bar manager at a local pool when a friend approached him about joining the volunteer fire department. He hadn’t previously given it a thought. Yet, he immediately became fascinated by the inner workings of how the organization came together as a team. He was impressed that such a large group of volunteers could be coordinated to achieve great things in the community. The do-it-yourselfer in Ken was also fascinated with the department’s dizzying array of tools and equipment.
Later that same year, he went off to college at the University of North Carolina at Greensboro. Ken conveys his choice of UNCG simply as “My parents could afford the school, and it was farther away than Rutgers.” As was previously stated, he pursued a degree in Management Information Systems & Operations Management, which was a natural choice, in retrospect. From early adulthood, Ken had a predisposition towards organizational thinking, technology, leadership, and management.
After graduating from college, Ken began his career at AT&T as a software developer and simultaneously became more involved with the fire department. He started his coding journey with an internal COBOL development program at AT&T. Ken rose through the organization over the next ten years. Ken eventually became a District Manager, with a staff of 80+ and 3 direct report managers. Concurrently, he rose through the ranks of the fire department. He became President, then worked his way up as Assistant, 2nd Assistant, then eventually Chief. At the fire department, Ken leads a multi-faceted team of 60 volunteers.
The overlap of these two paths is significant. Both have a business and support side that require intense management, efficient organization, and experienced leadership at a high level. A software company’s business revolves around planning and scheduling releases, conducting regular status meetings, managing budgets, and interfacing with customers. The fire department is organized as a not-for-profit business and, as such, has a President that presides over the company’s business. This includes filing tax for
ms with the state, managing donations, fiscal planning, project planning, creating specifications, procurement, politics, and leading public meetings. Both positions require an individual at the top with stellar organizational and planning skills and a positive demeanor supporting customers.
For a software company, every product requires support. Users will encounter defects, and those defects must quickly be researched, verified, and remediated. Customers will occasionally have ad-hoc, high-priority requests in response to their own business’ stimuli, colloquially referred to as “fires” by the production support team. In parallel, the support side of the firehouse handles responding to dispatched 911 calls and extinguishing actual, physical fire alerts sent through an Incident Command System. When asked which fires are harder to control, Ken quipped, “The actual fires … usually”.
On both fronts, teams are composed of individuals with specific roles and skills. For a software company, those roles are typically developers, designers, quality assurance, and IT. Team members use their varied skills and come together to create solutions. When a challenge arises, Developers will research the code base and provide technical solutions. Production support accesses the logs in production and applies their working knowledge of the system and the user’s workflow to determine how to recreate the issue. IT investigates network, security, and server-related issues. The fire department is similarly multi-faceted. The engine company performs fire suppression, the truck company provides ventilation and search capabilities, and others whose job is to provide a water supply. Clearly, both organizations need a respected and capable leader to coordinate the varied problem resolution activities in a responsive and professional manner.
In the summer of 2021, Ken celebrated his 35th year with the Liberty Corner Fire Department. I’d like to extend the celebration by adding to it Ken’s 35th year of applying, like Liam Neeson (Taken), “a particular set of skills,” both technical and managerial, to every aspect of his professional and personal life.
1 http://www.libertycornerfire.org/ – please help their cause by donating!