golangsub的簡單介紹

本文目錄一覽:

Golang Float高精度計算,無誤差

Golang Float乘Float高精度,轉Int高精度。

使用big.Float

bigF1 := new(big.Float).SetFloat64(f1)

bigF2 := new(big.Float).SetFloat64(f2)

mul := new(big.Float).Mul(bigF1, bigF2)

轉Int,先用上面的方法轉為big.Float,再用.String轉為字元串。

new(big.Int).SetString(bigFloat, 10) // 即可轉為big.Int

// big.Int可轉為常用的int類型。

// big.Float可轉為常用的Float類型。

// big.Float不能直接轉為Int類型。

func Sub(x float64, y float64, more …float64) float64 {

  floatX := new(big.Float).SetFloat64(x)

  floatY := new(big.Float).SetFloat64(y)

  result := new(big.Float).Sub(floatX, floatY)

  if len(more) 0 {

      for _, m := range more {

        floatM := new(big.Float).SetFloat64(m)

        result = new(big.Float).Sub(result, floatM)

}

}

  f, _ := strconv.ParseFloat(result.String(), 64)

  return f

}

golang正則表達式 分組命名

正則中有分組這個功能,在golang中也可以使用命名分組。

一次匹配的情況

場景還原如下:

有一行文本,格式為:姓名 年齡 郵箱地址

請將其轉換為一個map

代碼實現如下:

str := `Alice 20 alice@gmail.com`

// 使用命名分組,顯得更清晰

re := regexp.MustCompile(`(?Pname[a-zA-Z]+)\s+(?Page\d+)\s+(?Pemail\w+@\w+(?:\.\w+)+)`)

match := re.FindStringSubmatch(str)

groupNames := re.SubexpNames()

fmt.Printf(“%v, %v, %d, %d\n”, match, groupNames, len(match), len(groupNames))

result := make(map[string]string)

// 轉換為map

for i, name := range groupNames {

if i != 0 name != “” { // 第一個分組為空(也就是整個匹配)

result[name] = match[i]

}

}

prettyResult, _ := json.MarshalIndent(result, “”, ” “)

fmt.Printf(“%s\n”, prettyResult)

輸出為:

[Alice 20 alice@gmail.com Alice 20 alice@gmail.com], [ name age email], 4, 4

{

“age”: “20”,

“email”: “alice@gmail.com”,

“name”: “Alice”

}

注意 [ name age email]有4個元素, 第一個為””。

多次匹配的情況

接上面的例子,實現一個更貼近現實的需求:

有一個文件, 內容大致如下:

Alice 20 alice@gmail.com

Bob 25 bob@outlook.com

gerrylon 26 gerrylon@github.com

更多內容

和上面一樣, 不過這次轉出來是一個slice of map, 也就是多個map。

代碼如下:

// 文件內容直接用字元串表示

usersStr := `

Alice 20 alice@gmail.com

Bob 25 bob@outlook.com

gerrylon 26 gerrylon@github.com

`

userRe := regexp.MustCompile(`(?Pname[a-zA-Z]+)\s+(?Page\d+)\s+(?Pemail\w+@\w+(?:\.\w+)+)`)

// 這裡要用FindAllStringSubmatch,找到所有的匹配

users := userRe.FindAllStringSubmatch(usersStr, -1)

groupNames := userRe.SubexpNames()

var result []map[string]string // slice of map

// 循環所有行

for _, user := range users {

m := make(map[string]string)

// 對每一行生成一個map

for j, name := range groupNames {

if j != 0 name != “” {

m[name] = strings.TrimSpace(user[j])

}

}

result = append(result, m)

}

prettyResult, _ := json.MarshalIndent(result, “”, ” “)

fmt.Println(string(prettyResult))

輸出為:

[

{

“age”: “20”,

“email”: “alice@gmail.com”,

“name”: “Alice”

},

{

“age”: “25”,

“email”: “bob@outlook.com”,

“name”: “Bob”

},

{

“age”: “26”,

“email”: “gerrylon@github.com”,

“name”: “gerrylon”

}

]

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

總結

使用命名分組可以使正則表示的意義更清晰。

轉換為map更加符合人類的閱讀習慣,不過比一般的根據索引取分組值麻煩一些。

————————————————

版權聲明:本文為CSDN博主「butterfly5211314」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。

原文鏈接:

golang使用Nsq

1. 介紹

最近在研究一些消息中間件,常用的MQ如RabbitMQ,ActiveMQ,Kafka等。NSQ是一個基於Go語言的分散式實時消息平台,它基於MIT開源協議發布,由bitly公司開源出來的一款簡單易用的消息中間件。

官方和第三方還為NSQ開發了眾多客戶端功能庫,如官方提供的基於HTTP的nsqd、Go客戶端go-nsq、Python客戶端pynsq、基於Node.js的JavaScript客戶端nsqjs、非同步C客戶端libnsq、Java客戶端nsq-java以及基於各種語言的眾多第三方客戶端功能庫。

1.1 Features

1). Distributed

NSQ提供了分散式的,去中心化,且沒有單點故障的拓撲結構,穩定的消息傳輸發布保障,能夠具有高容錯和HA(高可用)特性。

2). Scalable易於擴展

NSQ支持水平擴展,沒有中心化的brokers。內置的發現服務簡化了在集群中增加節點。同時支持pub-sub和load-balanced 的消息分發。

3). Ops Friendly

NSQ非常容易配置和部署,生來就綁定了一個管理界面。二進位包沒有運行時依賴。官方有Docker image。

4.Integrated高度集成

官方的 Go 和 Python庫都有提供。而且為大多數語言提供了庫。

1.2 組件

1.3 拓撲結構

NSQ推薦通過他們相應的nsqd實例使用協同定位發布者,這意味著即使面對網路分區,消息也會被保存在本地,直到它們被一個消費者讀取。更重要的是,發布者不必去發現其他的nsqd節點,他們總是可以向本地實例發布消息。

NSQ

首先,一個發布者向它的本地nsqd發送消息,要做到這點,首先要先打開一個連接,然後發送一個包含topic和消息主體的發布命令,在這種情況下,我們將消息發布到事件topic上以分散到我們不同的worker中。

事件topic會複製這些消息並且在每一個連接topic的channel上進行排隊,在我們的案例中,有三個channel,它們其中之一作為檔案channel。消費者會獲取這些消息並且上傳到S3。

nsqd

每個channel的消息都會進行排隊,直到一個worker把他們消費,如果此隊列超出了內存限制,消息將會被寫入到磁碟中。Nsqd節點首先會向nsqlookup廣播他們的位置信息,一旦它們註冊成功,worker將會從nsqlookup伺服器節點上發現所有包含事件topic的nsqd節點。

nsqlookupd

2. Internals

2.1 消息傳遞擔保

1)客戶表示已經準備好接收消息

2)NSQ 發送一條消息,並暫時將數據存儲在本地(在 re-queue 或 timeout)

3)客戶端回復 FIN(結束)或 REQ(重新排隊)分別指示成功或失敗。如果客戶端沒有回復, NSQ 會在設定的時間超時,自動重新排隊消息

這確保了消息丟失唯一可能的情況是不正常結束 nsqd 進程。在這種情況下,這是在內存中的任何信息(或任何緩衝未刷新到磁碟)都將丟失。

如何防止消息丟失是最重要的,即使是這個意外情況可以得到緩解。一種解決方案是構成冗餘 nsqd對(在不同的主機上)接收消息的相同部分的副本。因為你實現的消費者是冪等的,以兩倍時間處理這些消息不會對下游造成影響,並使得系統能夠承受任何單一節點故障而不會丟失信息。

2.2 簡化配置和管理

單個 nsqd 實例被設計成可以同時處理多個數據流。流被稱為「話題」和話題有 1 個或多個「通道」。每個通道都接收到一個話題中所有消息的拷貝。在實踐中,一個通道映射到下行服務消費一個話題。

在更底的層面,每個 nsqd 有一個與 nsqlookupd 的長期 TCP 連接,定期推動其狀態。這個數據被 nsqlookupd 用於給消費者通知 nsqd 地址。對於消費者來說,一個暴露的 HTTP /lookup 介面用於輪詢。為話題引入一個新的消費者,只需啟動一個配置了 nsqlookup 實例地址的 NSQ 客戶端。無需為添加任何新的消費者或生產者更改配置,大大降低了開銷和複雜性。

2.3 消除單點故障

NSQ被設計以分布的方式被使用。nsqd 客戶端(通過 TCP )連接到指定話題的所有生產者實例。沒有中間人,沒有消息代理,也沒有單點故障。

這種拓撲結構消除單鏈,聚合,反饋。相反,你的消費者直接訪問所有生產者。從技術上講,哪個客戶端連接到哪個 NSQ 不重要,只要有足夠的消費者連接到所有生產者,以滿足大量的消息,保證所有東西最終將被處理。對於 nsqlookupd,高可用性是通過運行多個實例來實現。他們不直接相互通信和數據被認為是最終一致。消費者輪詢所有的配置的 nsqlookupd 實例和合併 response。失敗的,無法訪問的,或以其他方式故障的節點不會讓系統陷於停頓。

2.4 效率

對於數據的協議,通過推送數據到客戶端最大限度地提高性能和吞吐量的,而不是等待客戶端拉數據。這個概念,稱之為 RDY 狀態,基本上是客戶端流量控制的一種形式。

efficiency

2.5 心跳和超時

組合應用級別的心跳和 RDY 狀態,避免頭阻塞現象,也可能使心跳無用(即,如果消費者是在後面的處理消息流的接收緩衝區中,操作系統將被填滿,堵心跳)為了保證進度,所有的網路 IO 時間上限勢必與配置的心跳間隔相關聯。這意味著,你可以從字面上拔掉之間的網路連接 nsqd 和消費者,它會檢測並正確處理錯誤。當檢測到一個致命錯誤,客戶端連接被強制關閉。在傳輸中的消息會超時而重新排隊等待傳遞到另一個消費者。最後,錯誤會被記錄並累計到各種內部指標。

2.6 分散式

因為NSQ沒有在守護程序之間共享信息,所以它從一開始就是為了分散式操作而生。個別的機器可以隨便宕機隨便啟動而不會影響到系統的其餘部分,消息發布者可以在本地發布,即使面對網路分區。

這種「分散式優先」的設計理念意味著NSQ基本上可以永遠不斷地擴展,需要更高的吞吐量?那就添加更多的nsqd吧。唯一的共享狀態就是保存在lookup節點上,甚至它們不需要全局視圖,配置某些nsqd註冊到某些lookup節點上這是很簡單的配置,唯一關鍵的地方就是消費者可以通過lookup節點獲取所有完整的節點集。清晰的故障事件——NSQ在組件內建立了一套明確關於可能導致故障的的故障權衡機制,這對消息傳遞和恢復都有意義。雖然它們可能不像Kafka系統那樣提供嚴格的保證級別,但NSQ簡單的操作使故障情況非常明顯。

2.7 no replication

不像其他的隊列組件,NSQ並沒有提供任何形式的複製和集群,也正是這點讓它能夠如此簡單地運行,但它確實對於一些高保證性高可靠性的消息發布沒有足夠的保證。我們可以通過降低文件同步的時間來部分避免,只需通過一個標誌配置,通過EBS支持我們的隊列。但是這樣仍然存在一個消息被發布後馬上死亡,丟失了有效的寫入的情況。

2.8 沒有嚴格的順序

雖然Kafka由一個有序的日誌構成,但NSQ不是。消息可以在任何時間以任何順序進入隊列。在我們使用的案例中,這通常沒有關係,因為所有的數據都被加上了時間戳,但它並不適合需要嚴格順序的情況。

2.9 無數據重複刪除功能

NSQ對於超時系統,它使用了心跳檢測機制去測試消費者是否存活還是死亡。很多原因會導致我們的consumer無法完成心跳檢測,所以在consumer中必須有一個單獨的步驟確保冪等性。

3. 實踐安裝過程

本文將nsq集群具體的安裝過程略去,大家可以自行參考官網,比較簡單。這部分介紹下筆者實驗的拓撲,以及nsqadmin的相關信息。

3.1 拓撲結構

topology

實驗採用3台NSQD服務,2台LOOKUPD服務。

採用官方推薦的拓撲,消息發布的服務和NSQD在一台主機。一共5台機器。

NSQ基本沒有配置文件,配置通過命令行指定參數。

主要命令如下:

LOOKUPD命令

NSQD命令

工具類,消費後存儲到本地文件。

發布一條消息

3.2 nsqadmin

對Streams的詳細信息進行查看,包括NSQD節點,具體的channel,隊列中的消息數,連接數等信息。

nsqadmin

channel

列出所有的NSQD節點:

nodes

消息的統計:

msgs

lookup主機的列表:

hosts

4. 總結

NSQ基本核心就是簡單性,是一個簡單的隊列,這意味著它很容易進行故障推理和很容易發現bug。消費者可以自行處理故障事件而不會影響系統剩下的其餘部分。

事實上,簡單性是我們決定使用NSQ的首要因素,這方便與我們的許多其他軟體一起維護,通過引入隊列使我們得到了堪稱完美的表現,通過隊列甚至讓我們增加了幾個數量級的吞吐量。越來越多的consumer需要一套嚴格可靠性和順序性保障,這已經超過了NSQ提供的簡單功能。

結合我們的業務系統來看,對於我們所需要傳輸的發票消息,相對比較敏感,無法容忍某個nsqd宕機,或者磁碟無法使用的情況,該節點堆積的消息無法找回。這是我們沒有選擇該消息中間件的主要原因。簡單性和可靠性似乎並不能完全滿足。相比Kafka,ops肩負起更多負責的運營。另一方面,它擁有一個可複製的、有序的日誌可以提供給我們更好的服務。但對於其他適合NSQ的consumer,它為我們服務的相當好,我們期待著繼續鞏固它的堅實的基礎。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/188316.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-28 13:29
下一篇 2024-11-28 13:29

相關推薦

  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • Python海龜代碼簡單畫圖

    本文將介紹如何使用Python的海龜庫進行簡單畫圖,並提供相關示例代碼。 一、基礎用法 使用Python的海龜庫,我們可以控制一個小海龜在窗口中移動,並利用它的「畫筆」在窗口中繪製…

    編程 2025-04-29
  • Python櫻花樹代碼簡單

    本文將對Python櫻花樹代碼進行詳細的闡述和講解,幫助讀者更好地理解該代碼的實現方法。 一、簡介 櫻花樹是一種圖形效果,它的實現方法比較簡單。Python中可以通過turtle這…

    編程 2025-04-28
  • Python大神作品:讓編程變得更加簡單

    Python作為一種高級的解釋性編程語言,一直被廣泛地運用於各個領域,從Web開發、遊戲開發到人工智慧,Python都扮演著重要的角色。Python的代碼簡潔明了,易於閱讀和維護,…

    編程 2025-04-28
  • 用Python實現簡單爬蟲程序

    在當今時代,互聯網上的信息量是爆炸式增長的,其中很多信息可以被利用。對於數據分析、數據挖掘或者其他一些需要大量數據的任務,我們可以使用爬蟲技術從各個網站獲取需要的信息。而Pytho…

    編程 2025-04-28
  • 如何製作一個簡單的換裝遊戲

    本文將從以下幾個方面,為大家介紹如何製作一個簡單的換裝遊戲: 1. 遊戲需求和界面設計 2. 使用HTML、CSS和JavaScript開發遊戲 3. 實現遊戲的基本功能:拖拽交互…

    編程 2025-04-27
  • Guava Limiter——限流器的簡單易用

    本文將從多個維度對Guava Limiter進行詳細闡述,介紹其定義、使用方法、工作原理和案例應用等方面,並給出完整的代碼示例,希望能夠幫助讀者更好地了解和使用該庫。 一、定義 G…

    編程 2025-04-27
  • 2的32次方-1:一個看似簡單卻又複雜的數字

    對於計算機領域的人來說,2的32次方-1(也就是十進位下的4294967295)這個數字並不陌生。它經常被用來表示IPv4地址或者無符號32位整數的最大值。但實際上,這個數字卻包含…

    編程 2025-04-27
  • 製作一個簡單的管理系統的成本及實現

    想要製作一個簡單的管理系統,需要進行技術選型、開發、測試等過程,那麼這個過程會花費多少錢呢?我們將從多個方面來闡述製作一個簡單的管理系統的成本及實現。 一、技術選型 當我們開始思考…

    編程 2025-04-27

發表回復

登錄後才能評論