Variables & Constants


#1

I’ve seen the docs on how to set variables within subroutines but is there a way to define constants that can be read across the subroutines?

Seems wasteful to be setting up variables on every vcl_recv when the value is always going to be the same.


#2

Do you have examples of the sort of things you have in mind as constants?

VCL is compiled to C, and then to machine code, and C compilers can do a lot of optimization, so I’m not sure there’s a lot of waste going on, but I can most certainly check.


#3

@drwilco we have a few:

  • The threshold of users allowed on to the site. Generally, this is left set to 100%, but can be lowered to limit traffic in event of exceptionally-high origin load.
  • Maintenance page toggle. Used to mask the system when updates requiring downtime are made.

In both instances, we will adjust the values in VCL and activate the new version.


#4

Ah, good points. We (SEs and other VCL users at Fastly) have been using Edge Dictionaries for that. Basically we will have a settings table, and have various keys for knobs to tweak. And if used a lot, we’ll load the values into local variables, especially if there’s conversion.

With Edge Dictionaries you get the ability to do a change to a value with a single API call. And now that you can batch updates, you can even change multiple values with a single API call, and forego having to clone & activate.

Other than datatype, there’s no real advantage over using dictionaries to constants. Dictionaries allow for flexibility and a more general usecase, whereas constants would require us to know which variables have to be there, which complicates our controlplane a lot. Edge Dictionaries can cover missing “variables”, by using table lookups with a supplied default value.