Handling Execution of a Function
20230033971 · 2023-02-02
Inventors
- Zoltán Turányi (Szentendre, HU)
- Dániel Géhberger (Montreal, CA)
- Gabor Nemeth (Budapest, HU)
- Péter Mátray (Budapest, HU)
- Balázs Pinczel (Budapest, HU)
Cpc classification
H04L67/1008
ELECTRICITY
H04L67/52
ELECTRICITY
H04L67/63
ELECTRICITY
International classification
Abstract
There is provided a method for handling execution of a function in a function-as-a- service (FaaS) system. According to the method, in response (200) to a trigger on a first node of the FaaS system for execution of a function, execution of the function is initiated (206) on the first node of the FaaS system if data to be accessed for the execution is stored on the first node of the FaaS system and/or execution of the function is initiated (210) on a second node of the FaaS system if the data to be accessed for the execution is stored on the second node of the FaaS system.
Claims
1-18. (canceled)
19. A method for handling execution of a function in a function-as-a-service (FaaS) system, the method comprising: grouping the function into a group of functions for which the same data is to be accessed for execution of the functions in the group; and in response to a trigger on a first node of the FaaS system for execution of the function: initiating execution of the function on the first node of the FaaS system if data to be accessed for the execution is stored on the first node of the FaaS system; and/or initiating execution of the function on a second node of the FaaS system if the data to be accessed for the execution is stored on the second node of the FaaS system; wherein the execution of the function is initiated on the same node as at least one other function in the group.
20. The method as claimed in claim 19, wherein: the data that is to be accessed for the execution of the function and that is stored on the first node of the FaaS system is specific to a first subscriber and/or a location of the first subscriber; and/or the data that is to be accessed for the execution of the function and that is stored on the second node of the FaaS system is specific to a second subscriber and/or a location of the second subscriber.
21. The method as claimed in claim 19, wherein an input provided to the function is indicative of the data to be accessed for the execution or a majority of the data to be accessed for the execution.
22. The method as claimed in claim 19, wherein an input provided to the function is indicative of a subscriber to which the data to be accessed for the execution is specific and/or a location of the subscriber to which the data to be accessed for the execution is specific.
23. The method as claimed in claim 19, wherein the method comprises, if a load generated by the execution of the function is greater than an available capacity of the first node or the second node on which the execution is initiated, initiating the execution of the function on a third node of the FaaS system for which an available capacity is less than the load generated by the execution and at which the data to be accessed for the execution is stored.
24. The method as claimed in claim 19, wherein said grouping comprises assigning the function to an existing group of functions for which the same data is to be accessed for execution of the functions or creating a group of functions that comprises the function and at least one other function for which the same data is to be accessed for execution of the functions.
25. The method as claimed in claim 19, wherein the group of functions are executable on the same node.
26. The method as claimed in claim 19, wherein the method comprises, if a load generated by execution of the group of functions becomes greater than the available capacity of a node of the FaaS system on which the group of functions is executed, switching execution of functions of the group specific to a subscriber from the node of the FaaS system on which the group of functions is executed to another node of the FaaS system at which data to be accessed for execution of the functions of the group specific to the subscriber is stored.
27. The method as claimed in claim 19, wherein the functions in the group of functions are executed on a plurality of nodes of the FaaS system, wherein the method comprises, if a load generated by execution of the group of functions becomes a predefined amount less than a combined available capacity of the plurality of nodes of the FaaS system on which the group of functions is executed, for a selected node of the plurality of nodes of the FaaS system, switching execution of functions of the group from the selected node of the FaaS system to another node of the FaaS system that is executing functions of the group.
28. A node for handling execution of a function in a function-as-a-service (FaaS) system, wherein the node comprises processing circuitry configured to: group the function into a group of functions for which the same data is to be accessed for execution of the functions in the group; and in response to a trigger on a first node of the FaaS system for execution of the function: initiate execution of the function on the first node of the FaaS system if data to be accessed for the execution is stored on the first node of the FaaS system; and/or initiate execution of the function on a second node of the FaaS system if the data to be accessed for the execution is stored on the second node of the FaaS system; wherein the processing circuitry is configured to initiate execution of the function on the same node as at least one other function in the group.
29. The node as claimed in claim 28, wherein the node is the first node.
30. The node as claimed in claim 28, wherein: the data that is to be accessed for the execution of the function and that is stored on the first node of the FaaS system is specific to a first subscriber and/or a location of the first subscriber; and/or the data that is to be accessed for the execution of the function and that is stored on the second node of the FaaS system is specific to a second subscriber and/or a location of the second subscriber.
31. The node as claimed in claim 28, wherein an input provided to the function is indicative of the data to be accessed for the execution or a majority of the data to be accessed for the execution.
32. The node as claimed in claim 28, wherein an input provided to the function is indicative of a subscriber to which the data to be accessed for the execution is specific and/or a location of the subscriber to which the data to be accessed for the execution is specific.
33. The node as claimed in claim 28, wherein the processing circuitry is configured to, if a load generated by the execution of the function is greater than an available capacity of the first node or the second node on which the execution is initiated, initiate the execution of the function on a third node of the FaaS system for which an available capacity is less than the load generated by the execution and at which the data to be accessed for the execution is stored.
34. The node as claimed in claim 28, wherein the processing circuitry is configured to group the function by assigning the function to an existing group of functions for which the same data is to be accessed for execution of the functions or creating a group of functions that comprises the function and at least one other function for which the same data is to be accessed for execution of the functions.
35. The node as claimed in claim 28, wherein the group of functions are executable on the same node.
36. The node as claimed in claim 28, wherein the processing circuitry is configured to, if a load generated by execution of the group of functions becomes greater than the available capacity of a node of the FaaS system on which the group of functions is executed, switch execution of functions of the group specific to a subscriber from the node of the FaaS system on which the group of functions is executed to another node of the FaaS system at which data to be accessed for execution of the functions of the group specific to the subscriber is stored.
37. The node as claimed in claim 28, wherein the functions in the group of functions are executed on a plurality of nodes of the FaaS system, wherein the processing circuitry is configured to, if a load generated by execution of the group of functions becomes a predefined amount less than a combined available capacity of the plurality of nodes of the FaaS system on which the group of functions is executed, for a selected node of the plurality of nodes of the FaaS system, switch execution of functions of the group from the selected node of the FaaS system to another node of the FaaS system that is executing functions of the group.
38. A function-as-a-service (FaaS) system comprising a node for handling execution of a function in the FaaS system, wherein the node is configured to: group the function into a group of functions for which the same data is to be accessed for execution of the functions in the group; and in response to a trigger on a first node of the FaaS system for execution of the function: initiate execution of the function on the first node of the FaaS system if data to be accessed for the execution is stored on the first node of the FaaS system; and/or initiate execution of the function on a second node of the FaaS system if the data to be accessed for the execution is stored on the second node of the FaaS system; wherein the node is configured to initiate execution of the function on the same node as at least one other function in the group.
Description
BRIEF DESCRIPTION OF THE DRAWINGS
[0024] For a better understanding of the technique, and to show how it may be put into effect, reference will now be made, by way of example, to the accompanying drawings, in which:
[0025]
[0026]
[0027]
[0028]
[0029]
[0030]
[0031]
DETAILED DESCRIPTION
[0032] As mentioned earlier, an advantageous technique for handling execution of a function in a function-as-a-service (FaaS) system is provided.
[0033] Generally, a FaaS system provides a platform that allows application functionality to be developed, run and managed without the complexity of building and maintaining an infrastructure in order to do so. In a FaaS system, multiple functions may work on the same (externalized) data. For example, in the case of a FaaS system that handles mobile control plane events, one function may be responsible for handling a handover of a user equipment (UE) between two cells, while another function may be responsible for moving the UE to idle mode. Both functions are related to a UE and, as they are executed, they modify and store an overlapping set of data in a database used for storing information indicative of a state of the UE.
[0034] The functions in a FaaS system are attached to a trigger for execution of a function. This trigger referred to herein can be referred to as a “triggering event”. Examples of such a trigger referred to herein include but are not limited to a hypertext transfer protocol (HTTP) request (such as a GET request or a POST request) to a uniform resource locator (URL) via the HTTP, an incoming message through a messaging system, or a change in a database. Herein, a method is described for handling execution of a function in a FaaS system in response to a trigger on a node of the FaaS system for execution of the function.
[0035]
[0036] As illustrated in
[0037] Briefly, the processing circuitry 12 of the node 10 is configured to, in response to a trigger on a first node of the FaaS system for execution of a function, initiate execution of the function on the first node of the FaaS system if data to be accessed for the execution is stored on the first node of the FaaS system and/or initiate execution of the function on a second node of the FaaS system if the data to be accessed for the execution is stored on the second node of the FaaS system. Herein, the term “initiate” can mean, for example, cause or establish. Thus, for example, the processing circuitry 12 of the node 10 may itself establish execution of the function or may cause another node to establish execution of the function. Herein, the data to be accessed for execution of a function may, for example, comprise a state of the function and/or a context in which function is to be executed.
[0038] In some embodiments, the node 10 may be the first node of the FaaS system. In these embodiments, the first node of the FaaS system may be capable of communicating with the second node of the FaaS system and/or any other nodes of the FaaS system. In other embodiments, the node 10 may be the second node of the FaaS system. In these embodiments, the second node of the FaaS system may be capable of communicating with the first node of the FaaS system and/or any other nodes of the FaaS system. In yet other embodiments, the node 10 may be any other node of the FaaS system. For example, the node 10 may be a separate node to those nodes of the FaaS (e.g. the first node of the FaaS and/or second node of the FaaS) at which the data to be accessed for the execution is stored. In these embodiments, the node 10 may be capable of communicating with the first node of the FaaS system, the second node of the FaaS system, and/or any other nodes of the FaaS system. The nodes referred to herein may also be referred to as “compute nodes”.
[0039] Returning back to
[0040] The processing circuitry 12 of the node 10 can be connected to the memory 14 of the node 10. In some embodiments, the memory 14 of the node 10 may be for storing program code or instructions which, when executed by the processing circuitry 12 of the node 10, cause the node 10 to operate in the manner described herein in respect of the node 10. For example, in some embodiments, the memory 14 of the node 10 may be configured to store program code or instructions that can be executed by the processing circuitry 12 of the node 10 to cause the node 10 to operate in accordance with the method described herein in respect of the node 10. Alternatively, or in addition, the memory 14 of the node 10 can be configured to store any requests, responses, indications, information, data, notifications, signals, or similar, that are described herein. The processing circuitry 12 of the node 10 may be configured to control the memory 14 of the node 10 to store any requests, responses, indications, information, data, notifications, signals, or similar, that are described herein.
[0041] In some embodiments, as illustrated in
[0042] Although the node 10 is illustrated in
[0043] It will also be appreciated that
[0044] The first node and/or the second node referred to herein may comprise the same components of the node 10, as described with reference to
[0045]
[0046] As illustrated at block 200 of
[0047] If, at block 202 of
[0048] If, at block 202 of
[0049] Thus, according to the method of
[0050] In some embodiments, the execution of the function may be initiated on the same node as at least one other function for which the same data is to be accessed for execution of the at least one other function. In some embodiments, the data stored on the first node of the FaaS system may be specific to a first subscriber (or user) and/or a location of the first subscriber. In some embodiments, the data stored on the second node of the FaaS system may be specific to a second subscriber (or user) and/or a location of the second subscriber. In some embodiments, an input provided to the function may be indicative of (or may comprise a token indicative of) the data to be accessed for the execution or a majority of the data to be accessed for the execution. In some embodiments, an input provided to the function may be indicative of (or may comprise a token indicative of) a subscriber (or user) to which the data is specific or a location of the subscriber to which the data is specific. Herein, a subscriber (or user) can be any subscriber (or user) of the FaaS system. That is, a subscriber (or user) can be any entity that is subscribed to (or that is using) the FaaS system. Examples of a subscriber (or user) include, but are not limited to, entities such as a UE (e.g. a mobile terminal), a car, or any other entity.
[0051] Although not illustrated in
[0052] Although also not illustrated in
[0053] In some embodiments, an affinity group may contain function attachments (and thus function executions) that work on the same externalized states. In some embodiments, an affinity group may be spread over multiple nodes in the FaaS system. As will be described in more detail later, in some of these embodiments, with the use of the input (e.g. which may comprise a token) passed to the FaaS system during triggering, it is possible to consistently allocate function executions to ensure that the externalized data is locally available, thereby improving execution performance.
[0054] As the same executable function may be attached to different triggers, e.g. serving different purposes, the relevant entity is a function attachment from the affinity group point of view. Besides the function attachment, functions may be executed directly through a command line interface or by another function, and in this case the affinity group may also be relevant. For example, if function A directly executes function B, it may be desired for function B to inherit the affinity group setting of function A.
[0055] Although not illustrated in
[0056] Thus, in the manner described, execution of functions of the group specific to a subscriber can be re-allocated to a different node (or a runtime of a different node), e.g. that has enough resources available to execute those functions of the group for that subscriber. In this way, the execution of all functions for a specific subscriber can be moved to a different node of the FaaS system. The group of functions (and thus the load) can thus be split into two or more shards and these shards can then be allocated to nodes (or runtimes of nodes) that can handle the (approximated) load. Once a group of functions is sharded, the shards may be re-allocated to less loaded nodes (or less loaded runtimes of nodes). In this way, the FaaS system can be scaled-out.
[0057] Thus, in some embodiments, a group of functions may be executed on a plurality of nodes of the FaaS system. In some of these embodiments, if a load generated by execution of the group of functions becomes a predefined amount (e.g. a significantly) less than a combined available capacity of the plurality of nodes of the FaaS system on which the group of functions is executed, for a selected node of the plurality of nodes of the FaaS system, execution of the functions of the group may be switched from the selected node of the FaaS system to another node of the FaaS system that is executing functions of the group. More specifically, the processing circuitry 12 of the node 10 may initiate this switching. As such, in some embodiments that involve splitting a group of functions (and thus a load) into two or more shards as described earlier, if a load of the FaaS system decreases and the group of functions can be serviced by less nodes (or less runtime instances of nodes), the two or more shards of the group of functions may be merged. In some embodiments, the (merged) shards may be re-allocated to leave nodes (or runtime instances of nodes) without function attachments. In this way, the FaaS system can be scaled-in.
[0058] Over time, the triggering rate of specific functions may vary, which can cause the load of the FaaS system to also change. For example, if functions are handling events related to a mobile core network, the load may be higher during the day and lower over the night. Thus, the dynamic splitting of groups of functions, the dynamic merging of functions and/or the dynamic re-allocation of functions described earlier can help to balance the load in the FaaS system.
[0059] There is thus described herein an advantageous technique for handling execution of a function in a FaaS system.
[0060]
[0061] The first node 300 is running a first runtime instance 302. The second node 400 is running a second runtime instance 402. The first node 300 comprises a first database 312 that is configured to store data 314. The second node 400 comprises a second database 412 that is also configured to store data 414. At each database 312, 412, the stored data 314, 414 can comprise a plurality of data elements, e.g. a plurality of keys. The first database 312 and/or the second database 412 can have multiple instances. In each node 300, 400, the runtime instance 302, 402 and the instances of the database 312, 412 can form their own, separate clusters. In the case of the database 312, 412, the stored data is distributed between the instances participating in the cluster.
[0062] In the example illustrated in
[0063] As illustrated by the arrows 310 in
[0064]
[0065] The first node 500 is running a first runtime instance 502. The second node 600 is running a second runtime instance 602. The first node 500 comprises a first database 512 that is configured to store data 514. The second node 600 comprises a second database 612 that is also configured to store data 614. At each database 512, 612, the stored data 514, 614 can comprise a plurality of data elements, e.g. a plurality of keys. The first database 512 and/or the second database 612 can have multiple instances. In each node 500, 600, the runtime instance 502, 602 and the instances of the database 512, 612 can form their own, separate clusters. In the case of the database 512, 612, the stored data is distributed between the instances participating in the cluster.
[0066] In the example illustrated in
[0067] The FaaS system of
[0068] Thus, in response to the first trigger 506 on the first node 500 of the FaaS system for execution of the first function 504, execution of the first function 504 is initiated on the first node 500 of the FaaS system as data 514 to be accessed for the execution is stored on the first node 500 of the FaaS system. Similarly, in response to the second trigger 520 on the first node 500 of the FaaS system for execution of the second function 524, execution of the second function 524 is initiated on the first node 500 of the FaaS system as data 514 to be accessed for the execution is stored on the first node 500 of the FaaS system.
[0069] In this way, as illustrated by the arrows 510 in
[0070] In some cases, the load caused by a single affinity group AG1 (which in this example comprises the first function 504 and the second function 522) may be higher than the first node 500 (or the first runtime instance 402 of the first node 500) can handle. This may be the case even with only a single function allocated to the AG. A manner in which this can be addressed will be described with reference to
[0071]
[0072] The first node 700 is running a first runtime instance 702. The second node 800 is running a second runtime instance 802. The first node 700 comprises a first database 712 that is configured to store data 714. The second node 800 comprises a second database 812 that is also configured to store data 814. At each database 712, 812, the stored data 714, 814 can comprise a plurality of data elements, e.g. a plurality of keys. The first database 712 and/or the second database 812 can have multiple instances. In each node 700, 800, the runtime instance 702, 802 and the instances of the database 712, 812 can form their own, separate clusters. In the case of the database 712, 812, the stored data is distributed between the instances participating in the cluster.
[0073] The FaaS system illustrated in
[0074] In more detail, in
[0075] With reference to
[0076] Similarly, in response to the second trigger 720 on the first node 700 of the FaaS system for execution of the second function 722, execution of the second function 722 is initiated on (e.g. the first runtime instance 702 of) the first node 700 of the FaaS system if the data 714 to be accessed for the execution is stored on (e.g. the database 712 of) the first node 700 of the FaaS system. Alternatively or in addition, in response to the second trigger 720 on the first node 700 of the FaaS system for execution of the second function 822, execution of the second function 822 is initiated on (e.g. the second runtime instance 802 of) the second node 800 of the FaaS system if the data 814 to be accessed for the execution is stored on (e.g. the database 812 of) the second node 800 of the FaaS system. Thus, the execution of the first function 704, 804 is initiated on the same node 700, 800 as the second function 722, 822 for which the same data 714, 814 is to be accessed for execution of the second function 722, 822.
[0077] In contrast to
[0078] The first function 704 executed on the first node 700 has a first input (e.g. value) 708, the second function 722 executed on the first node 700 has a second input (e.g. value) 724, the second function 822 executed on the second node 800 has a third input (e.g. value) 726, and the first function 804 executed on the second node 800 has a fourth input (e.g. value) 728. Any one or more of the first input 708, second input 724, third input 726, and fourth input 728 may be different.
[0079] Based on the inputs 708, 724, 726, 728 that are usually given to the functions 704, 722, 804, 822 during triggering, it is not possible to identify which subscriber the current execution will work on as the inputs 708, 724, 726, 728 may be given in any custom encoded form. Thus, according to this embodiment, the input 708, 724, 726, 728 for each function triggering provides a hint to the node 700, 800 (or runtime instance 702, 802) on which the function 704, 722, 804, 822 is to be executed. For example, a token may be provided as part of the input 708, 724, 726, 728 for each function triggering. The token can have a relation with the externalized data elements 814 that a function 804, 822 is to access, e.g. in majority. For example, the token may be a subscriber identification (ID). A token can be used by a function 704, 722, 804, 822 to derive different subscriber-specific data elements 714, 814 in a database (e.g. subscriber-specific keys in a key-value store) 712, 812. In some embodiments, the token may be generated by extracting a relevant part of the input 708, 724, 726, 728 or by hashing the input 708, 724, 726, 728, e.g. with a custom hash function. In some embodiments, the same method for generating the token may be used for all the executions to ensure consistent behaviour. For example, the token may always a given subscriber’s ID according to some embodiments. Although
[0080] If the input 708, 724, 726, 728 for each function 704, 722, 804, 822 is indicative of the data 714, 814 (or a majority of the data 714, 814) to be accessed for the execution of the first function 704, 722, 804, 822, the functions 704, 722, 804, 822 that are to access the same data 714, 814 (or the majority of the same data 714, 814) can be executed on the same node 700, 800. For example, if a token is provided, the FaaS system can ensure that functions 704, 722, 804, 822 with the same token are executed on the same node 700, 800. This makes it possible for functions (or groups of functions) to be consistently spread to multiple nodes 700, 800, whilst maintaining the data locality features as well. In
[0081] In more detail, in the example illustrated in
[0082] For example, the first input 708 provided to the first function 704 may be (e.g. can include a token) indicative of a subscriber (or user) to which the data 714 is specific and/or a location of the subscriber to which the data 714 is specific (e.g. User 1 and location A), the second input 724 provided to the second function 722 may be (e.g. can include a token) indicative of a subscriber (or user) to which the data 714 is specific and/or a location of the subscriber to which the data 714 is specific (e.g. User 1 and location B), the third input 726 provided to the second function 822 may be (e.g. can include a token) indicative of a subscriber (or user) to which the data 814 is specific and/or a location of the subscriber to which the data 814 is specific (e.g. User 2 and location B), and the fourth input 728 provided to the first function 804 may be (e.g. can include a token) indicative of a subscriber (or user) to which the data 814 is specific and/or a location of the subscriber to which the data 814 is specific (e.g. User 2 and location A).
[0083] The first function 704 and the second function 722 executed on the first node 700 may use overlapping data, e.g. an overlapping set of data elements. In the example illustrated in
[0084] Thus, related data elements 714, 814 can be stored in the local databases 712, 812 (or local instances of the databases 712, 812) for all subscribers. In this way, optimal partitioning of data in the FaaS system can be achieved and optimal performance of the FaaS system can be provided. During scaling in or out events, a fraction of tokens may be reallocated to new nodes of the FaaS, but the FaaS system can automatically reach a stable token distribution after a short period of time.
[0085] Returning back to
[0086] Thus, according to the example of
[0087] In this way, as illustrated by the arrows 710, 810 in
[0088] In some embodiments, for example, if a load generated by execution of a group of functions AG1 becomes greater than an available capacity of the node 700 of the FaaS system on which the execution of that group of functions AG1 is initiated, execution of the functions 804, 822 of the group AG1 specific to a subscriber (User2) may be switched from the node 700 of the FaaS system on which the group of functions AG1 is executed to another node 800 of the FaaS system (e.g. for which an available capacity is less than the load generated by execution of the functions 804, 822 of the group AG1 specific to the subscriber User2 and) at which data to be accessed for execution of the functions 804, 822 of the group AG1 specific to the subscriber User2 is stored. This results in the arrangement illustrated in
[0089] Although not illustrated in
[0090]
[0091] At block 902 of
[0092] On the other hand, if affinity group A does not exist and a new group of functions (or a new affinity group) is to be created at block 904 of
[0093]
[0094] There is also provided a FaaS system, which can comprise at least one node 10, 1000 as described herein. The FaaS system can also comprise the first node described herein, the second node described herein, the third node described herein, and/or any other nodes referred to herein.
[0095] There is also provided a computer program comprising instructions which, when executed by processing circuitry (such as the processing circuitry 12 of the node 10 described earlier), cause the processing circuitry to perform at least part of the method described herein. There is provided a computer program product, embodied on a non-transitory machine-readable medium, comprising instructions which are executable by processing circuitry (such as the processing circuitry 12 of the node 10 described earlier) to cause the processing circuitry to perform at least part of the method described herein. There is provided a computer program product comprising a carrier containing instructions for causing processing circuitry (such as the processing circuitry 12 of the node 10 described earlier) to perform at least part of the method described herein. In some embodiments, the carrier can be any one of an electronic signal, an optical signal, an electromagnetic signal, an electrical signal, a radio signal, a microwave signal, or a computer-readable storage medium.
[0096] The node functionality described herein can be performed by hardware. Thus, any one or more nodes described herein can be a hardware node. However, it will also be understood that at least part or all of the node functionality described herein can be virtualized. For example, the functions performed by any one or more nodes can be implemented in software running on generic hardware that is configured to orchestrate the node functionality. Thus, in some embodiments, any one or more nodes described herein can be a virtual node. In some embodiments, at least part or all of the node functionality described herein may be performed in a network enabled cloud. The node functionality described herein may all be at the same location or at least some of the node functionality may be distributed.
[0097] It will be understood that at least some or all of the method steps described herein can be automated in some embodiments. That is, in some embodiments, at least some or all of the method steps described herein can be performed automatically.
[0098] Thus, in the manner described herein, there is advantageously provided an improved technique for handling execution of a function in a FaaS system.
[0099] It should be noted that the above-mentioned embodiments illustrate rather than limit the idea, and that those skilled in the art will be able to design many alternative embodiments without departing from the scope of the appended claims. The word “comprising” does not exclude the presence of elements or steps other than those listed in a claim, “a” or “an” does not exclude a plurality, and a single processor or other unit may fulfil the functions of several units recited in the claims. Any reference signs in the claims shall not be construed so as to limit their scope.