@@ -66,6 +66,8 @@ type benchCmd struct {
66
66
deDuplicationWindow time.Duration
67
67
ack bool
68
68
randomizeGets int
69
+ payloadFilename string
70
+ hdrs []string
69
71
}
70
72
71
73
const (
@@ -107,6 +109,8 @@ func configureBenchCommand(app commandHost) {
107
109
addPubFlags := func (f * fisk.CmdClause ) {
108
110
f .Flag ("multisubject" , "Multi-subject mode, each message is published on a subject that includes the publisher's message sequence number as a token" ).UnNegatableBoolVar (& c .multiSubject )
109
111
f .Flag ("multisubjectmax" , "The maximum number of subjects to use in multi-subject mode (0 means no max)" ).Default ("100000" ).IntVar (& c .multiSubjectMax )
112
+ f .Flag ("payload" , "File containing a message payload to send" ).ExistingFileVar (& c .payloadFilename )
113
+ f .Flag ("header" , "Adds headers to the message using K:V format" ).Short ('H' ).StringsVar (& c .hdrs )
110
114
}
111
115
112
116
addJSCommonFlags := func (f * fisk.CmdClause ) {
@@ -163,6 +167,8 @@ func configureBenchCommand(app commandHost) {
163
167
request := microService .Command ("request" , "Send a request and wait for its reply" ).Action (c .requestAction )
164
168
request .Help ("Send a request and wait for a reply" )
165
169
request .Arg ("subject" , "Subject to use for the benchmark" ).Required ().StringVar (& c .subject )
170
+ request .Flag ("payload" , "File containing the payload to send" ).ExistingFileVar (& c .payloadFilename )
171
+ request .Flag ("header" , "Adds headers to the message using K:V format" ).Short ('H' ).StringsVar (& c .hdrs )
166
172
// TODO: support randomized payload data
167
173
168
174
reply := microService .Command ("serve" , "Service requests" ).Action (c .serveAction )
@@ -1534,9 +1540,36 @@ func (c *benchCmd) oldjsPullAction(_ *fisk.ParseContext) error {
1534
1540
return nil
1535
1541
}
1536
1542
1537
- func (c * benchCmd ) coreNATSPublisher (nc * nats.Conn , progress * uiprogress.Bar , msg []byte , numMsg int , offset int ) error {
1543
+ func (c benchCmd ) getPayload (msgSize int ) ([]byte , error ) {
1544
+ if len (c .payloadFilename ) > 0 {
1545
+
1546
+ buffer , err := os .ReadFile (c .payloadFilename )
1547
+ if err != nil {
1548
+ return nil , fmt .Errorf ("reading the payload file: %w" , err )
1549
+ }
1550
+
1551
+ return buffer , nil
1552
+ }
1553
+
1554
+ buffer := make ([]byte , msgSize )
1555
+ return buffer , nil
1556
+ }
1557
+
1558
+ func (c * benchCmd ) coreNATSPublisher (nc * nats.Conn , progress * uiprogress.Bar , payloadSize int , numMsg int , offset int ) error {
1538
1559
state := "Publishing"
1539
1560
1561
+ payload , err := c .getPayload (payloadSize )
1562
+ if err != nil {
1563
+ return err
1564
+ }
1565
+
1566
+ headers , err := iu .ParseStringsToHeader (c .hdrs , 0 )
1567
+ if err != nil {
1568
+ return err
1569
+ }
1570
+
1571
+ message := nats.Msg {Data : payload , Header : headers }
1572
+
1540
1573
if progress != nil {
1541
1574
progress .PrependFunc (func (b * uiprogress.Bar ) string {
1542
1575
return state
@@ -1550,7 +1583,8 @@ func (c *benchCmd) coreNATSPublisher(nc *nats.Conn, progress *uiprogress.Bar, ms
1550
1583
progress .Incr ()
1551
1584
}
1552
1585
1553
- err := nc .Publish (c .getPublishSubject (i + offset ), msg )
1586
+ message .Subject = c .getPublishSubject (i + offset )
1587
+ err := nc .PublishMsg (& message )
1554
1588
if err != nil {
1555
1589
return fmt .Errorf ("publishing: %w" , err )
1556
1590
}
@@ -1562,11 +1596,22 @@ func (c *benchCmd) coreNATSPublisher(nc *nats.Conn, progress *uiprogress.Bar, ms
1562
1596
return nil
1563
1597
}
1564
1598
1565
- func (c * benchCmd ) coreNATSRequester (nc * nats.Conn , progress * uiprogress.Bar , msg [] byte , numMsg int , offset int ) error {
1599
+ func (c * benchCmd ) coreNATSRequester (nc * nats.Conn , progress * uiprogress.Bar , payloadSize int , numMsg int , offset int ) error {
1566
1600
errBytes := []byte ("error" )
1567
1601
minusByte := byte ('-' )
1568
1602
1569
1603
state := "Requesting"
1604
+ payload , err := c .getPayload (payloadSize )
1605
+ if err != nil {
1606
+ return err
1607
+ }
1608
+
1609
+ headers , err := iu .ParseStringsToHeader (c .hdrs , 0 )
1610
+ if err != nil {
1611
+ return err
1612
+ }
1613
+
1614
+ message := nats.Msg {Data : payload , Header : headers }
1570
1615
1571
1616
if progress != nil {
1572
1617
progress .PrependFunc (func (b * uiprogress.Bar ) string {
@@ -1581,7 +1626,9 @@ func (c *benchCmd) coreNATSRequester(nc *nats.Conn, progress *uiprogress.Bar, ms
1581
1626
progress .Incr ()
1582
1627
}
1583
1628
1584
- m , err := nc .Request (c .getPublishSubject (i + offset ), msg , opts ().Timeout )
1629
+ message .Subject = c .getPublishSubject (i + offset )
1630
+
1631
+ m , err := nc .RequestMsg (& message , opts ().Timeout )
1585
1632
if err != nil {
1586
1633
return fmt .Errorf ("requesting: %w" , err )
1587
1634
}
@@ -1597,13 +1644,24 @@ func (c *benchCmd) coreNATSRequester(nc *nats.Conn, progress *uiprogress.Bar, ms
1597
1644
return nil
1598
1645
}
1599
1646
1600
- func (c * benchCmd ) jsPublisher (nc * nats.Conn , progress * uiprogress.Bar , msg [] byte , numMsg int , idPrefix string , pubNumber string , offset int ) error {
1647
+ func (c * benchCmd ) jsPublisher (nc * nats.Conn , progress * uiprogress.Bar , payloadSize int , numMsg int , idPrefix string , pubNumber string , offset int ) error {
1601
1648
js , err := c .getJS (nc )
1602
1649
if err != nil {
1603
1650
return err
1604
1651
}
1605
1652
1606
1653
var state string
1654
+ payload , err := c .getPayload (payloadSize )
1655
+ if err != nil {
1656
+ return err
1657
+ }
1658
+
1659
+ headers , err := iu .ParseStringsToHeader (c .hdrs , 0 )
1660
+ if err != nil {
1661
+ return err
1662
+ }
1663
+
1664
+ message := nats.Msg {Data : payload , Header : headers }
1607
1665
1608
1666
if progress != nil {
1609
1667
progress .PrependFunc (func (b * uiprogress.Bar ) string {
@@ -1619,19 +1677,20 @@ func (c *benchCmd) jsPublisher(nc *nats.Conn, progress *uiprogress.Bar, msg []by
1619
1677
futures := make ([]jetstream.PubAckFuture , min (c .batchSize , numMsg - i ))
1620
1678
for j := 0 ; j < c .batchSize && (i + j ) < numMsg ; j ++ {
1621
1679
if c .deDuplication {
1622
- header := nats.Header {}
1623
- header .Set (nats .MsgIdHdr , idPrefix + "-" + pubNumber + "-" + strconv .Itoa (i + j + offset ))
1624
- message := nats.Msg {Data : msg , Header : header , Subject : c .getPublishSubject (i + j + offset )}
1625
- futures [j ], err = js .PublishMsgAsync (& message )
1626
- } else {
1627
- futures [j ], err = js .PublishAsync (c .getPublishSubject (i + j + offset ), msg )
1680
+ message .Header .Set (nats .MsgIdHdr , idPrefix + "-" + pubNumber + "-" + strconv .Itoa (i + j + offset ))
1628
1681
}
1682
+
1683
+ message .Subject = c .getPublishSubject (i + j + offset )
1684
+
1685
+ futures [j ], err = js .PublishMsgAsync (& message )
1629
1686
if err != nil {
1630
1687
return fmt .Errorf ("publishing asynchronously: %w" , err )
1631
1688
}
1689
+
1632
1690
if progress != nil {
1633
1691
progress .Incr ()
1634
1692
}
1693
+
1635
1694
time .Sleep (c .sleep )
1636
1695
}
1637
1696
@@ -1659,14 +1718,14 @@ func (c *benchCmd) jsPublisher(nc *nats.Conn, progress *uiprogress.Bar, msg []by
1659
1718
if progress != nil {
1660
1719
progress .Incr ()
1661
1720
}
1721
+
1662
1722
if c .deDuplication {
1663
- header := nats.Header {}
1664
- header .Set (nats .MsgIdHdr , idPrefix + "-" + pubNumber + "-" + strconv .Itoa (i + offset ))
1665
- message := nats.Msg {Data : msg , Header : header , Subject : c .getPublishSubject (i + offset )}
1666
- _ , err = js .PublishMsg (ctx , & message )
1667
- } else {
1668
- _ , err = js .Publish (ctx , c .getPublishSubject (i + offset ), msg )
1723
+ message .Header .Set (nats .MsgIdHdr , idPrefix + "-" + pubNumber + "-" + strconv .Itoa (i + offset ))
1669
1724
}
1725
+
1726
+ message .Subject = c .getPublishSubject (i + offset )
1727
+
1728
+ _ , err = js .PublishMsg (ctx , & message )
1670
1729
if err != nil {
1671
1730
return fmt .Errorf ("publishing synchronously: %w" , err )
1672
1731
}
@@ -1742,11 +1801,6 @@ func (c *benchCmd) runCorePublisher(bm *bench.Benchmark, errChan chan error, nc
1742
1801
return
1743
1802
}
1744
1803
1745
- var msg []byte
1746
- if c .msgSize > 0 {
1747
- msg = make ([]byte , c .msgSize )
1748
- }
1749
-
1750
1804
<- trigger
1751
1805
1752
1806
// introduces some jitter between the publishers if sleep is set and more than one publisher
@@ -1756,7 +1810,7 @@ func (c *benchCmd) runCorePublisher(bm *bench.Benchmark, errChan chan error, nc
1756
1810
}
1757
1811
1758
1812
start := time .Now ()
1759
- err := c .coreNATSPublisher (nc , progress , msg , numMsg , offset )
1813
+ err := c .coreNATSPublisher (nc , progress , c . msgSize , numMsg , offset )
1760
1814
if err != nil {
1761
1815
errChan <- fmt .Errorf ("publishing: %w" , err )
1762
1816
donewg .Done ()
@@ -1862,11 +1916,6 @@ func (c *benchCmd) runCoreRequester(bm *bench.Benchmark, errChan chan error, nc
1862
1916
progress .Width = iu .ProgressWidth ()
1863
1917
}
1864
1918
1865
- var msg []byte
1866
- if c .msgSize > 0 {
1867
- msg = make ([]byte , c .msgSize )
1868
- }
1869
-
1870
1919
<- trigger
1871
1920
1872
1921
// introduces some jitter between the publishers if sleep is set and more than one publisher
@@ -1876,7 +1925,7 @@ func (c *benchCmd) runCoreRequester(bm *bench.Benchmark, errChan chan error, nc
1876
1925
}
1877
1926
1878
1927
start := time .Now ()
1879
- err := c .coreNATSRequester (nc , progress , msg , numMsg , offset )
1928
+ err := c .coreNATSRequester (nc , progress , c . msgSize , numMsg , offset )
1880
1929
if err != nil {
1881
1930
errChan <- fmt .Errorf ("requesting: %w" , err )
1882
1931
donewg .Done ()
@@ -1955,11 +2004,6 @@ func (c *benchCmd) runJSPublisher(bm *bench.Benchmark, errChan chan error, nc *n
1955
2004
progress .Width = iu .ProgressWidth ()
1956
2005
}
1957
2006
1958
- var msg []byte
1959
- if c .msgSize > 0 {
1960
- msg = make ([]byte , c .msgSize )
1961
- }
1962
-
1963
2007
<- trigger
1964
2008
1965
2009
// introduces some jitter between the publishers if sleep is set and more than one publisher
@@ -1969,7 +2013,7 @@ func (c *benchCmd) runJSPublisher(bm *bench.Benchmark, errChan chan error, nc *n
1969
2013
}
1970
2014
1971
2015
start := time .Now ()
1972
- err := c .jsPublisher (nc , progress , msg , numMsg , idPrefix , pubNumber , offset )
2016
+ err := c .jsPublisher (nc , progress , c . msgSize , numMsg , idPrefix , pubNumber , offset )
1973
2017
if err != nil {
1974
2018
errChan <- fmt .Errorf ("publishing: %w" , err )
1975
2019
donewg .Done ()
0 commit comments