---
title:  High Availability for Client-Server Communication
---

<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

The client provides reliable event messaging from cache server to client to prevent data loss during server failover operations. High availability is implemented in the cache server and is configured in the client.

See server documentation at [Configuring Highly Available Servers](<%=vars.serverman%>/developing/events/configuring_highly_available_servers.html) for details about configuring a server for high availability.

-   **[Configuring Clients for High Availability](configuring-nc-ha.html)**

    Configure high availability by setting the pool attribute `subscription-redundancy` to the number of copies maintained.

-   **[Sending Periodic Acknowledgment](sending-periodic-ack.html)**

    Servers use periodic acknowledgment to reduce the likelihood of duplicate notifications, and to reduce resource usage.
