代码之家  ›  专栏  ›  技术社区  ›  Junaid Farooq

基于日期灵丹妙药的主机间切换

  •  1
  • Junaid Farooq  · 技术社区  · 7 年前

    我们有三种类型的主机,运行文件系统并保存jpeg。一开始我们有一个主人 localhost:8888 那是以前 {{2017, 10, 31}, {23, 59, 59}} 我们开始处理两个主机新的一个是 localhost:8889 .

      def point_to_seaweed(request_date) do
        oct_date =
          {{2017, 10, 31}, {23, 59, 59}}
          |> Calendar.DateTime.from_erl!("UTC")
    
        case Calendar.DateTime.diff(request_date, oct_date) do
          {:ok, _, _, :after} -> "localhost:8889"
          _ -> "localhost:8888"
        end
      end
    

    请求日期大于 2017,10,31,23,59,59 我们换了新主人。但是现在 {{2018, 10, 31}, {23, 59, 59}} 我们正在换一台新主机,但还需要处理所有2台旧主机。

    我试过了。

      def point_to_seaweed(request_date) do
        oct_date =
          {{2017, 10, 31}, {23, 59, 59}}
          |> Calendar.DateTime.from_erl!("UTC")
    
        case Calendar.DateTime.diff(request_date, oct_date) do
          {:ok, secs, _, :after} ->
            case secs > 31536000 do
              true -> "localhost:8890"
              false -> "localhost:8889"
            end
          _ -> "localhost:8888"
        end
      end
    

    这是一个更好的方法吗? 31536000 是一年。这可以用另一种方法来实现?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Dogbert    7 年前

    我将为此使用内置的naivedatetime模块,并定义一个助手函数来检查erlang日期是否在另一个erlang日期之前:

    def before?(date1, date2) do
      NaiveDateTime.diff(NaiveDateTime.from_erl!(date1), NaiveDateTime.from_erl!(date2)) < 0
    end
    

    然后使用 cond :

    def point_to_seaweed(request_date) do
      port = cond do
        before?(request_date, {{2017, 10, 31}, {23, 59, 59}}) -> 8888
        before?(request_date, {{2018, 10, 31}, {23, 59, 59}}) -> 8889
        true -> 8890
      end
      "localhost:#{port}"
    end