---
title:  Function Execution
---

<!--
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.
-->

<a id="function_exec__section_CBD5B04ACC554029B5C710CE8E244FEA"></a>A function is a body of code that resides on a server and that an application can invoke from a client or from another server without the need to send the function code itself. The caller can direct a data-dependent function to operate on a particular dataset, or can direct a data-independent function to operate on a particular server, member, or member group.

The function execution service provides solutions for a variety of use cases, including:

-   An application needs to perform an operation on the data associated with a key. A registered server-side function can retrieve the data, operate on it, and put it back, with all processing performed locally to the server.
-   An application needs to initialize some of its components once on each server, which might be used later by executed functions.
-   A third-party service, such as a messaging service, requires initialization and startup.
-   Any arbitrary aggregation operation requires iteration over local data sets that can be done more efficiently through a single call to the cache server.
-   An external resource needs provisioning that can be done by executing a function on a server.

Check the following sections for more information:

-   **[How Function Execution Works](how_function_execution_works.html)**

-   **[Executing a Function in <%=vars.product_name_long%>](function_execution.html)**


